1

要素値が特定の文字列値である場合、要素値をクリアしたいだけです

入力xml

<A>
  <B>
    <C>BOLD</C>
  </B>
</A>

望ましい出力

<A>
  <B>
    <C/>
  </B>
</A>

私のxsltは次のように見えますが、機能しません。すべてをクリアするだけです

 <xsl:template match="A/B/C/text()">
    <xsl:if test="text()='BOLD'">
      <xsl:text></xsl:text>
    </xsl:if>
  </xsl:template>

<!--Copy the rest of the document as it is-->
  <xsl:template match="@* | node()">
    <xsl:copy>
      <xsl:apply-templates select="@* | node()"/>
    </xsl:copy>
  </xsl:template>

助けてくださいありがとう

4

3 に答える 3

1

ID テンプレートから始めた場合は、明示的な を使用する必要はありませんxsl:if。条件を空のテンプレートの一致式に入れるだけです。

<xsl:template match="A/B/C/text()[. = 'BOLD']"/>

A/B/Cの下にない、または のコンテンツではないテキスト ノードはBOLD、ID テンプレートによって処理され、通常どおりコピーされます。

match 式で使用する場合の注意点text()は、テンプレートが一度に 1 つのテキスト ノードのみを参照し、C要素内に直接あるテキストのみを参照することを意味することです。Cに他のコンテンツを含めることができる場合、いくつかの奇妙なエッジ ケースが発生します。

<C>BOLD<br/></C> --> <C><br/></C>
<C><b>B</b>OLD</C> --> unchanged
<C><b>BOLD</b></C> --> unchanged

子要素に関係なく、C の下の全文を 1 つの単位として扱いたい場合は、次のようなものが必要です。

<xsl:template match="C[. = 'BOLD']">
  <C/>
</xsl:template>

言うまでもなくtext()。これにより、上記の 3 つの例がすべてクリアされます。

于 2013-11-01T08:48:33.677 に答える