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

Remove nodes from nodeset when nodeset length is more than 1

我有一个 xml 喜欢

<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>

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

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