By using this site, you agree to our updated Privacy Policy and our Terms of Use. Manage your Cookies Settings.
446,231 Members | 1,636 Online
Bytes IT Community
+ Ask a Question
Need help? Post your question and get tips & solutions from a community of 446,231 IT Pros & Developers. It's quick & easy.

XPATH Nearest Node

P: n/a
Hi:
Is there a way in XPATH to find the nearest node of the node in
context with a certain attribute value. Here is my problem. I have the
following XML and I am trying to add all the nodes with attribute value

LNum=1 as child nodes of the nearest node above it with attribute
LNum=0....and add all the nodes with attribute value LNum=2 as child
nodes of the nearest node above it with attribute LNum=1 and so on. The

LNum value can go upto 10 or more but the pattern is always the same as

shown below. Any help on this will be greatly appreciated.
Thanks,
<Axes1 Axes1="1" Hierarchy="MHHSEntity">
<MHHSEntity Name="FB-MHHS" LNum="0" FmtValue="12,748"
Value="12748" />
<MHHSEntity Name="File Failure" LNum="1" FmtValue="8" Value="8"

/>
<MHHSEntity Name="File Success" LNum="1" FmtValue="3,179"
Value="3179" />
<MHHSEntity Name="IIS Success" LNum="1" FmtValue="3,187"
Value="3187" />
<MHHSEntity Name="MSMQ Failure" LNum="1" FmtValue="0" Value="0"

/>
<MHHSEntity Name="MSMQ Success" LNum="1" FmtValue="3,187"
Value="3187" />
<MHHSEntity Name="File Failure" LNum="2" FmtValue="8" Value="8"
/>
<MHHSEntity Name="File Success" LNum="2" FmtValue="3,179"
Value="3179"
/>
<MHHSEntity Name="IIS Success" LNum="2" FmtValue="3,187"
Value="3187"
/>
<MHHSEntity Name="SQL Failure" LNum="1" FmtValue="1,443"
Value="1443" />
<MHHSEntity Name="SQL Success" LNum="1" FmtValue="1,744"
Value="1744" />
<MHHSEntity Name="KT-MHHS" LNum="0" FmtValue="12,904"
Value="12904" />
<MHHSEntity Name="File Failure" LNum="1" FmtValue="7" Value="7"

/>
<MHHSEntity Name="File Success" LNum="1" FmtValue="3,219"
Value="3219" />
<MHHSEntity Name="IIS Failure" LNum="1" FmtValue="0" Value="0"
/>
<MHHSEntity Name="IIS Success" LNum="1" FmtValue="3,226"
Value="3226" />
<MHHSEntity Name="MSMQ Success" LNum="1" FmtValue="3,226"
Value="3226" />
<MHHSEntity Name="SQL Failure" LNum="1" FmtValue="1,301"
Value="1301" />
<MHHSEntity Name="SQL Success" LNum="1" FmtValue="1,925"
Value="1925" />
<MHHSEntity Name="MC-MHHS" LNum="0" FmtValue="14,608"
Value="14608" />
<MHHSEntity Name="File Failure" LNum="1" FmtValue="10"
Value="10" />
<MHHSEntity Name="File Failure" LNum="2" FmtValue="8" Value="8"
/>
<MHHSEntity Name="File Success" LNum="2" FmtValue="3,179"
Value="3179"
/>
<MHHSEntity Name="File Failure" LNum="3" FmtValue="8" Value="8"
/>
<MHHSEntity Name="File Success" LNum="3" FmtValue="3,179"
Value="3179"
/>
<MHHSEntity Name="IIS Success" LNum="3" FmtValue="3,187"
Value="3187"
/>
<MHHSEntity Name="IIS Success" LNum="2" FmtValue="3,187"
Value="3187"
/>
<MHHSEntity Name="File Success" LNum="1" FmtValue="3,642"
Value="3642" />
<MHHSEntity Name="IIS Failure" LNum="1" FmtValue="0" Value="0"
/>
<MHHSEntity Name="IIS Success" LNum="1" FmtValue="3,652"
Value="3652" />
<MHHSEntity Name="MSMQ Success" LNum="1" FmtValue="3,652"
Value="3652" />
<MHHSEntity Name="SQL Failure" LNum="1" FmtValue="1,470"
Value="1470" />
<MHHSEntity Name="SQL Success" LNum="1" FmtValue="2,182"
Value="2182" />
</Axes1>

Jul 20 '05 #1
Share this Question
Share on Google+
2 Replies


P: n/a
nkunapa wrote:
Hi:
Is there a way in XPATH to find the nearest node of the node in
context with a certain attribute value. Here is my problem. I have the
following XML and I am trying to add all the nodes with attribute value

LNum=1 as child nodes of the nearest node above it with attribute
LNum=0....and add all the nodes with attribute value LNum=2 as child
nodes of the nearest node above it with attribute LNum=1 and so on. The


Hi,

Have you thought about selecting all suitable nodes in the
preceding-sibling axis, and then pick the first of them? That should be
the nearest above (unless I have messed up something). The FIRST is
becuase the preceding-sibling is reverse; the first is the nearest to
the context.

preceding-sibling::*[@LNum=$MyLNumMinus1][1]

I tried it in an XSLT (just because that's all I have working right now
for evaluating XPath):
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">

<xsl:template match="thing">
<xsl:variable name="myLNumMinus1" select="@LNum - 1"/>
<xsl:variable name="catch"
select="preceding::*[@LNum=$myLNumMinus1][1]/@name"/>
<xsl:if test="$catch">
This node had a suitable ancestor:
<thing myName="{@name}" myLNum="{@LNum}"
ImLookingFor="{$myLNumMinus1}"
my-nearest-predecessor-with-that-LNum="{$catch}"/>
</xsl:if>
<xsl:apply-templates/>
</xsl:template>
</xsl:stylesheet>
For input file:

<?xml version="1.0"?>
<thing name="ancestor0" LNum="0">
<thing name="ancestor1" LNum="0">
<thing name="ancestor2" LNum="0">
<thing name="a-predecessor-but-not-an-ancestor-to-the-successor"
LNum="1"/>
<thing name="depth3" LNum="1">
<thing name="depth4" LNum="2"/>
<thing name="depth4, again" LNum="1"/>
</thing>
<thing name="depth3, again" LNum="2"/>
</thing>
</thing>
</thing>

I got
[dongfang@granada nearest-ancestor]$ xsltproc nearest-predecessor.xsl
things.xml
<?xml version="1.0"?>
This node had a suitable ancestor:
<thing myName="depth4" myLNum="2" ImLookingFor="1"
my-nearest-predecessor-with-that-LNum="a-predecessor-but-not-an-ancestor-to-the-successor"/>
This node had a suitable ancestor:
<thing myName="depth3, again" myLNum="2" ImLookingFor="1"
my-nearest-predecessor-with-that-LNum="depth4, again"/>
[dongfang@granada nearest-ancestor]$
With your "flat" documents it doesn't matter whether you use precesing
or preceding-sibling; it's the same.

Soren

Jul 20 '05 #2

P: n/a
Soren:
Wow! This worked. Thanks a lot. You really gave me a big hint . I
never came across "preceding-sibling" nor "preceding" XPATH queries. I
really appreciate your help on this.

Thanks,
NVK

Jul 20 '05 #3

This discussion thread is closed

Replies have been disabled for this discussion.