奇怪的XSL匹配行为

时间:2017-11-13 17:35:45

标签: xslt

我无法获得有关XSL匹配规则的内容。

我有这样的意见:

<root>
  <metadata>
  </metadata>
  <elements>
    <a-elems>
          <a>A1</a>
          <a>A2</a>
    </a-elems>
    <b-elems>
      <b>B1</b>
      <b>B2</b>
    </b-elems>
  </elements>
</root>

此XSL按我的意愿工作,报告<a>值列表:

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

    <xsl:template match = "/">
        _____ Elements _____
        <xsl:apply-templates select = "root/elements/*/*" />
    </xsl:template>


  <xsl:template match = "a-elems/a">
    __ A ELEM: <xsl:value-of select = "."></xsl:value-of> __
  </xsl:template>

  <xsl:template match="*">
        <xsl:message>Excluding <xsl:value-of select = "name(.)" /></xsl:message>
  </xsl:template>

</xsl:stylesheet>

但是,我认为这个根模板,我说明我想要开始的级别,会更清晰:

<xsl:template match = "/root/elements">
    _____ Elements _____
    <xsl:apply-templates select = "*/*" />
</xsl:template>

但它不起作用,我得到'排除根'消息,我理解模板从不匹配。我不明白为什么,我也试过select =“*”并添加优先级属性。

1 个答案:

答案 0 :(得分:1)

XSLT将首先查找匹配/(文档节点)的模板。通过将匹配/的模板更改为/root/elements,将导致XSLT使用built-in template rule来匹配/。这个内置模板实际上是这样的:

<xsl:template match = "/">
    <xsl:apply-templates />
</xsl:template>

xsl:apply-templates将选择子root节点。然后,这将与匹配*的模板匹配,以便您收到消息,并且不再执行任何处理。

最简单的解决方案是回到你拥有的东西。

编辑:在回答您的评论时,您并不总是需要重新定义/。原始解决方案的另一个细微变化就是这样做......

<xsl:template match = "root">
    _____ Elements _____
    <xsl:apply-templates select = "elements/*/*" />
</xsl:template>