[Home] [By Thread] [By Date] [Recent Entries]
At 08:47 PM 6/11/2008, you wrote:
Here's a basic 1.0 solution that should return the xpath creation you describe.... And here's some generic XSLT 1.0 that will return an XPath for any node on request. Just apply templates in the "xpath" mode to the node for which you want the path. Cheers, Wendell <?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" > <xsl:template match="node()" mode="xpath">
<xsl:apply-templates select="ancestor::*|." mode="xpath-step"/>
</xsl:template> <xsl:template match="/" mode="xpath-step">
<xsl:text>/</xsl:text>
</xsl:template><xsl:template match="*" mode="xpath-step"> <xsl:text>/</xsl:text> <xsl:value-of select="name()"/> <xsl:if test="count(../*[name()=name(current())]) > 1"> <xsl:text>[</xsl:text> <xsl:value-of select="count(preceding-sibling::*[name()=name(current())]) + 1"/> <xsl:text>]</xsl:text> </xsl:if> </xsl:template> <xsl:template match="text()" mode="xpath-step">
<xsl:text>/text()</xsl:text>
<xsl:if test="count(../text()) > 1">
<xsl:text>[</xsl:text>
<xsl:value-of select="count(preceding-sibling::text()) + 1"/>
<xsl:text>]</xsl:text>
</xsl:if>
</xsl:template><xsl:template match="processing-instruction()" mode="xpath-step"> <xsl:text>/processing-instruction()</xsl:text> <xsl:if test="count(../processing-instruction()) > 1"> <xsl:text>[</xsl:text> <xsl:value-of select="count(preceding-sibling::processing-instruction()) + 1"/> <xsl:text>]</xsl:text> </xsl:if> </xsl:template> <xsl:template match="comment()" mode="xpath-step">
<xsl:text>/comment()</xsl:text>
<xsl:if test="count(../comment()) > 1">
<xsl:text>[</xsl:text>
<xsl:value-of select="count(preceding-sibling::comment()) + 1"/>
<xsl:text>]</xsl:text>
</xsl:if>
</xsl:template> <xsl:template match="@*" mode="xpath-step">
<xsl:text>/@</xsl:text>
<xsl:value-of select="name()"/>
</xsl:template></xsl:stylesheet>
|

Cart



