xml – 如何在XSLT中输出当前元素路径?

前端之家收集整理的这篇文章主要介绍了xml – 如何在XSLT中输出当前元素路径?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
在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>

你如何区分这两个子节点?因此,您需要在item-sequence,child1和child [2]中添加一些索引。

猜你在找的XML相关文章