1

我有一个像

<Books>
 <Book Name="ABC">
  <Line No="43"/>
 </Book>
 <Book Name="XYZ">
  <Line No="44"/>
 </Book>
</Books>

仅当名称为“XYZ”的位置也存在时(或者名称为“ABC”的位置不是节点集中的唯一元素),我才必须删除名称为“ABC”的位置

我准备的 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>

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

4

1 回答 1

1

您在身份模板的正确行上,但是您需要将条件放在覆盖空模板的匹配模式中,而不是尝试使用 an 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不匹配的模式,则匹配器将回退到标识模板。

于 2015-01-30T11:37:03.553 回答