与其他模板一起使用时,Identity会转换奇怪的行为

时间:2016-03-22 04:57:12

标签: xslt transform xslt-2.0 identity

我看到过奇怪的行为,奇怪的是它与我们正常情况下的条件相反。 以下是详细信息:

  

XSLT代码

<?xml version="1.0" encoding="UTF-8" ?>

    

<xsl:template match="child[@include='1']"/>

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

  

源XML

<?xml version="1.0" encoding="UTF-8"?>
<Parent>
    <child include='1'>
        <Attribute>Attribute1</Attribute>
    </child>
    <child include='1'>
        <Attribute>Attribute2</Attribute>
    </child>
    <child include='0'>
        <Attribute>Attribute3</Attribute>
    </child>
    <child include='0'>
        <Attribute>Attribute4</Attribute>
    </child>
</Parent>
  

我的结果是:

<Parent>
  <child include="0">
        <Attribute>Attribute3</Attribute>
  </child>
  <child include="0">
        <Attribute>Attribute4</Attribute>
  </child>
</Parent>

根据正常情况我们应用的结果应符合以下条件

<xsl:template match="child[@include='1']"/>
<Parent>
  <child include="1">
        <Attribute>Attribute3</Attribute>
  </child>
  <child include="1">
        <Attribute>Attribute4</Attribute>
  </child>
</Parent>

希望我已详细解释: 这是代码和xslt处理器的链接:Sample Code

1 个答案:

答案 0 :(得分:1)

我不确定你的期望是什么。

您的第一个模板的优先级为0.5,而您的第二个(身份转换)模板的优先级为-0.5。

因此,应用于child属性为include的所有1元素的模板是第一个模板。 此模板为空,因此不输出任何内容。因此,输出中不会显示child属性为include的{​​{1}}元素。

所有其他节点都与第二个模板匹配,后者将它们(以及递归,它们的后代)复制到输出。