使用XSLT查找具有变量/更改位置的XML元素

时间:2016-12-15 23:26:11

标签: xslt xslt-1.0

使用XSLT,我需要从XML文件中找到标记元素,以开始进行所需的转换。 标记元素通常是根元素。

<tag>
   ...
</tag>

但是,新的XML文件集合到了,其中一些在其他地方有标记元素。 (其位置因文件而异)

<a>
  <b>
    <tag>
      ...
    </tag>
  </b>
</a>

我想知道是否可以获取标记的完整路径/名称并将其存储到变量中,因此我可以使用 $ tagPath 而不是< EM> / A / b /标签。我尝试使用name()函数,但它只返回元素名称(标记)。

谢谢!

1 个答案:

答案 0 :(得分:1)

根据上述评论,无论位置如何,要查找tag元素,您只需使用\\tag

如果您需要此元素的完整路径,可以使用此处提出的解决方案:How do you output the current element path in XSLT?

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

  <xsl:template match="text()|@*">
      <xsl:copy>
      <xsl:apply-templates select="node()|@*" />
      </xsl:copy>
  </xsl:template>

  <xsl:template match="//tag">
      <xsl:call-template name="genPath" />
  </xsl:template>

  <xsl:template name="genPath">
      <xsl:param name="prevPath" />
      <xsl:variable name="currPath" select="concat('/',name(),'[',count(preceding-sibling::*[name() = name(current())])+1,']',$prevPath)" />
      <xsl:for-each select="parent::*">
        <xsl:call-template name="genPath">
          <xsl:with-param name="prevPath" select="$currPath" />
        </xsl:call-template>
      </xsl:for-each>
      <xsl:if test="not(parent::*)">
        <xsl:value-of select="$currPath" />      
      </xsl:if>
  </xsl:template>

</xsl:stylesheet>

您可以在此处查看此示例:http://fiddle.frameless.io/