This is the mail archive of the xsl-list@mulberrytech.com mailing list .


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]

RE: Retrieving Full XPATH expression


This is not exactly what you need, but it might be a good starting point:

<!--
***************************************************************************
Template
    path

Description
    Converts a node to an XPath-like expression suitable for error messages.

Parameters
    node - Node to trace.  Default value is ".".
****************************************************************************
 -->
<xsl:template name="path">
    <xsl:param name="node" select="."/>

    <!-- Process ancestors first -->
    <xsl:if test="$node">
        <xsl:call-template name="path">
            <xsl:with-param name="node" select="$node/.."/>
        </xsl:call-template>
    </xsl:if>

    <!-- Process this node next -->
    <xsl:choose>
        <!-- No node.  Either the original node was empty, or we have
recursed
        past the root. -->
        <xsl:when test="not($node)"/>

        <!-- Root node -->
        <xsl:when test="not($node/..)">
            <xsl:text>/</xsl:text>
        </xsl:when>

        <!-- Attribute node (test if node is in set of parent's
attributes) -->
        <xsl:when test="$node = $node/../@*">
            <!-- Do not output the 'name' predicate; the element has output
it -->
            <xsl:if test="name($node) != 'name'">
                <!-- Output the attribute's value as a predicate as an
                additional hint as to which element we are referencing -->
                <xsl:text/>[@<xsl:value-of
select="name($node)"/>="<xsl:text/>
                <xsl:value-of select="$node"/>"]<xsl:text/>
            </xsl:if>

            <!-- Output the name of the element -->
            <xsl:text/>/@<xsl:value-of select="name($node)"/>
        </xsl:when>

        <!-- Some other node (with an optional 'name' attribute) -->
        <xsl:otherwise>
            <!-- Do not output a second / immediately after the root / -->
            <xsl:if test="$node/../.."> <!-- "if not a child of the
root" -->
                <xsl:text>/</xsl:text>
            </xsl:if>

            <!-- Output the name of the element -->
            <xsl:value-of select="name($node)"/>

            <!-- Add a 'name' predicate if present as an additional hint as
to
            which element we are referencing -->
            <xsl:if test="$node/@name">
                <xsl:text/>[@name="<xsl:value-of
select="$node/@name"/>"]<xsl:text/>
            </xsl:if>
        </xsl:otherwise>
    </xsl:choose>
</xsl:template>

-----Original Message-----
From: owner-xsl-list@lists.mulberrytech.com
[mailto:owner-xsl-list@lists.mulberrytech.com]On Behalf Of john smith
Sent: Friday, August 10, 2001 11:17 AM
To: xsl-list@lists.mulberrytech.com
Subject: [xsl] Retrieving Full XPATH expression


Given:

<A>
  <B>
    <C>
      <D id="007">
        <E>val1</E>
      </D>
      <D id="008">
        <E>val2</E>
      </D>
    <C>
  </B>
</A>

How do I get the full Xpath for each node..For example, if the
context node is <E> (with value "val1"), I want to get its full xpath
as A/B/C/D[1]/E[1] and for the second occurrence of <E> (with value "val2"),
I want to get its full xpath as A/B/C/D[2]/E[2].

Thanks a lot for the help.

_________________________________________________________________
Get your FREE download of MSN Explorer at http://explorer.msn.com/intl.asp


 XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list


 XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]