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>

これはうまくいかないようです。ここで私が間違っているのは何ですか。

4

1 に答える 1

1

あなたはIDテンプレートで正しい行にいますが、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」の本と一致しますが、少なくとも 1 人の兄弟がいる場合に限られます。BookABC がBookそのパターンに一致しない唯一の場合、マッチャーは ID テンプレートにフォールバックします。

于 2015-01-30T11:37:03.553 に答える