[XSL-LIST Mailing List Archive Home] [By Thread] [By Date] [Recent Entries] [Reply To This Message] Re: Get XPath to Node from Node?
Jeff Saylor wrote: > I need to be able to get the node's XPath. Does anyone have an > example for how to do this? I am using MSXML 3.0. Hi Jeff, Below is a sample xml document and a stylesheet that takes a node-set parameter and produces one valid XPath expression for every member-node. stylesheet (buildPath.xsl): ------------------------- <xsl:stylesheet version='1.0' xmlns:xsl='http://www.w3.org/1999/XSL/Transform' xmlns:msxsl="urn:schemas-microsoft-com:xslt" > <xsl:output method="text"/> <xsl:variable name="theParmNodes" select="//namespace::*[local-name() = 'myNamespace']"/> <xsl:template match="/"> <xsl:variable name="theResult"> <xsl:for-each select="$theParmNodes"> <xsl:variable name="theNode" select="."/> <xsl:for-each select="$theNode | $theNode/ancestor-or-self::node()[..]"> <xsl:element name="slash">/</xsl:element> <xsl:choose> <xsl:when test="self::*"> <xsl:element name="nodeName"> <xsl:value-of select="name()"/> <xsl:variable name="thisPosition" select="count(preceding-sibling::*[name(current()) = name()])"/> <xsl:variable name="numFollowing" select="count(following-sibling::*[name(current()) = name()])"/> <xsl:if test="$thisPosition + $numFollowing > 0"> <xsl:value-of select="concat('[', $thisPosition + 1, ']')"/> </xsl:if> </xsl:element> </xsl:when> <xsl:otherwise> <!-- This node is not an element --> <xsl:choose> <xsl:when test="count(. | ../@*) = count(../@*)"> <!-- Attribute --> <xsl:element name="nodeName"> <xsl:value-of select="concat('@',name())"/> </xsl:element> </xsl:when> <xsl:when test="self::text()"> <!-- Text --> <xsl:element name="nodeName"> <xsl:value-of select="'text()'"/> <xsl:variable name="thisPosition" select="count(preceding-sibling::text())"/> <xsl:variable name="numFollowing" select="count(following-sibling::text())"/> <xsl:if test="$thisPosition + $numFollowing > 0"> <xsl:value-of select="concat('[', $thisPosition + 1, ']')"/> </xsl:if> </xsl:element> </xsl:when> <xsl:when test="self::processing-instruction()"> <!-- Processing Instruction --> <xsl:element name="nodeName"> <xsl:value-of select="'processing-instruction()'"/> <xsl:variable name="thisPosition" select="count(preceding-sibling::processing-instruction())"/> <xsl:variable name="numFollowing" select="count(following-sibling::processing-instruction())"/> <xsl:if test="$thisPosition + $numFollowing > 0"> <xsl:value-of select="concat('[', $thisPosition + 1, ']')"/> </xsl:if> </xsl:element> </xsl:when> <xsl:when test="self::comment()"> <!-- Comment --> <xsl:element name="nodeName"> <xsl:value-of select="'comment()'"/> <xsl:variable name="thisPosition" select="count(preceding-sibling::comment())"/> <xsl:variable name="numFollowing" select="count(following-sibling::comment())"/> <xsl:if test="$thisPosition + $numFollowing > 0"> <xsl:value-of select="concat('[', $thisPosition + 1, ']')"/> </xsl:if> </xsl:element> </xsl:when> <!-- Namespace: --> <xsl:when test="count(. | ../namespace::*) = count(../namespace::*)"> <xsl:variable name="apos">'</xsl:variable> <xsl:element name="nodeName"> <xsl:value-of select="concat('namespace::*', '[local-name() = ', $apos, local-name(), $apos, ']')"/> </xsl:element> </xsl:when> </xsl:choose> </xsl:otherwise> </xsl:choose> </xsl:for-each> <xsl:text>
</xsl:text> </xsl:for-each> </xsl:variable> <xsl:value-of select="msxsl:node-set($theResult)"/> </xsl:template> </xsl:stylesheet> xml source (buildPath.xml): ------------------------- <!-- top level Comment --> <root> <nodeA>textA</nodeA> <nodeA id="nodeA-2"> <?myProc ?> xxxxxxxx <nodeB/> <nodeB xmlns:myNamespace="myTestNamespace"> <!-- Comment within /root/nodeA[2]/nodeB[2] --> <nodeC/> <!-- 2nd Comment within /root/nodeA[2]/nodeB[2] --> </nodeB> yyyyyyy <nodeB/> <?myProc2 ?> </nodeA> </root> <!-- top level Comment --> Result: ------- /root/nodeA[2]/nodeB[2]/namespace::*[local-name() = 'myNamespace'] /root/nodeA[2]/nodeB[2]/nodeC/namespace::*[local-name() = 'myNamespace'] Hope this helps, Dimitre Novatchev. __________________________________________________ Do You Yahoo!? Yahoo! Photos - Share your holiday photos online! http://photos.yahoo.com/ XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list
|
PURCHASE STYLUS STUDIO ONLINE TODAY!Purchasing Stylus Studio from our online shop is Easy, Secure and Value Priced! Download The World's Best XML IDE!Accelerate XML development with our award-winning XML IDE - Download a free trial today! Subscribe in XML format
|