在XSLT中,有没有办法在处理元素时确定XML文档的位置?
示例:给出以下XML Doc Fragment …
<Doc> <Ele1> <Ele11> <Ele111> </Ele111> </Ele11> </Ele1> <Ele2> </Ele2> </Doc>
在XSLT中,如果我的上下文是元素“Ele111”,我如何让XSLT输出完整路径?我希望它输出:“/ Doc / Ele1 / Ele11 / Ele111”。
这个问题的上下文:我有一个非常大,非常深的文档,我想详尽地遍历(通常使用递归),如果我找到一个具有特定属性的元素,我想知道我在哪里找到它。我想我可以随身携带当前的路径,但我认为XSLT / XPath应该知道。
不要认为这是内置于XPath中的,你可能需要一个递归模板,比如我用这个例子的
here。它将遍历XML文档中的每个元素,并以类似于您所描述的样式输出该元素的路径。
<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" exclude-result-prefixes="xs" version="2.0"> <xsl:template match="/"> <paths> <xsl:apply-templates/> </paths> </xsl:template> <xsl:template match="//*"> <path> <xsl:for-each select="ancestor-or-self::*"> <xsl:call-template name="print-step"/> </xsl:for-each> </path> <xsl:apply-templates select="*"/> </xsl:template> <xsl:template name="print-step"> <xsl:text>/</xsl:text> <xsl:value-of select="name()"/> <xsl:text>[</xsl:text> <xsl:value-of select="1+count(preceding-sibling::*)"/> <xsl:text>]</xsl:text> </xsl:template> </xsl:stylesheet>
有一些并发症;考虑这棵树:
<root> <child/> <child/> </root>