XPATH Nearest Node

N

nkunapa

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>
 
S

Soren Kuula

nkunapa said:
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
 
N

nkunapa

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
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,982
Messages
2,570,185
Members
46,736
Latest member
AdolphBig6

Latest Threads

Top