This is the mail archive of the
xsl-list@mulberrytech.com
mailing list .
RE: Retrieving Full XPATH expression
- To: <xsl-list at lists dot mulberrytech dot com>
- Subject: RE: [xsl] Retrieving Full XPATH expression
- From: "Tom Landon" <toml at hablador dot com>
- Date: Fri, 10 Aug 2001 11:51:29 -0700
- Reply-To: xsl-list at lists dot mulberrytech dot com
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