当节点集长度大于1时,从节点集中删除节点

时间:2015-01-30 11:31:43

标签: xslt if-statement node-set

我有像

这样的xml
<Books>
 <Book Name="ABC">
  <Line No="43"/>
 </Book>
 <Book Name="XYZ">
  <Line No="44"/>
 </Book>
</Books>

我必须删除名称是&#34; ABC&#34;只有当姓名是&#34; XYZ&#34;也存在(或名称是&#34; ABC&#34;不是节点集中唯一的元素)

我准备的xslt就像:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="xml" indent="yes" />
<xsl:if test="count(Books/Book) > '1'">
  <xsl:strip-space elements="*" />
  <xsl:template match="@*|node()">
     <xsl:copy>
        <xsl:apply-templates select="@*|node()" />
     </xsl:copy>
  </xsl:template>
  <xsl:template match="Book[@Name='ABC']" />
</xsl:if>
</xsl:stylesheet>

这似乎不起作用。我在这里做错了什么

1 个答案:

答案 0 :(得分:1)

您使用身份模板在右侧,但您需要将条件置于覆盖空模板的匹配模式中,而不是尝试使用if(顶部不允许)无论如何,仅在模板内部。)

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
  <xsl:output method="xml" indent="yes" />
  <xsl:strip-space elements="*" />
  <xsl:template match="@*|node()">
     <xsl:copy>
        <xsl:apply-templates select="@*|node()" />
     </xsl:copy>
  </xsl:template>

  <xsl:template match="Book[@Name='ABC'][count(../Book) &gt; 1]" />
</xsl:stylesheet>

match模式将匹配“ABC”图书,但时至少有一个其他Book兄弟图书。如果ABC是该模式不匹配的唯一Book,则匹配器将回退到身份模板。