加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 07:59:38 所属栏目:百科 来源:网络整理
导读:在XSLT中,有没有办法在处理元素时确定XML文档的位置? 示例:给出以下XML Doc Fragment … Doc Ele1 Ele11 Ele111 /Ele111 /Ele11 /Ele1 Ele2 /Ele2/Doc 在XSLT中,如果我的上下文是元素“Ele111”,我如何让XSLT输出完整路径?我希望它输出:“/ Doc / Ele
在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]中添加一些索引。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读