XPATH Nearest Node

Discussion in 'XML' started by nkunapa, Apr 5, 2005.

  1. nkunapa

    nkunapa Guest

    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>
     
    nkunapa, Apr 5, 2005
    #1
    1. Advertising

  2. nkunapa

    Soren Kuula Guest

    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
     
    Soren Kuula, Apr 10, 2005
    #2
    1. Advertising

  3. nkunapa

    nkunapa Guest

    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
     
    nkunapa, Apr 11, 2005
    #3
    1. Advertising

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

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Replies:
    0
    Views:
    1,567
  2. Steve
    Replies:
    5
    Views:
    42,740
    Steve
    May 17, 2004
  3. Alastair Cameron
    Replies:
    1
    Views:
    7,443
    SQL Server Development Team [MSFT]
    Jul 8, 2003
  4. Tjerk Wolterink
    Replies:
    2
    Views:
    1,458
    Dimitre Novatchev
    Aug 24, 2006
  5. Nick Leverton
    Replies:
    2
    Views:
    608
    Nick Leverton
    Dec 5, 2008
Loading...

Share This Page