0

私が尋ねた以前の質問から分岐して、どうすればexample/one/fieldexample/three/fieldが CDATA に囲まれていることを確認example/two/fieldできますか?

入力:

<?xml version="1.0"?>
<example>
  <one>
    <field>CDATA required here</field>
  </one>
  <two>
    <field>No CDATA thanks</field>
  </two>
  <three>
    <field>More CDATA please</field>
  </three>
</example>

必要な出力:

<?xml version="1.0"?>
<example>
  <one>
    <field><![CDATA[CDATA required here]]></field>
  </one>
  <two>
    <field>No CDATA thanks</field>
  </two>
  <three>
    <field><![CDATA[More CDATA please]]></field>
  </three>
</example>

指定できます<xsl:output cdata-section-elements="field"/>が、これも影響example/two/fieldします。のようなパスを入力しようとしました<xsl:output cdata-section-elements="example/one/field example/three/field"/>が、これによりエラーが発生します (エラー XTSE0280: 無効な要素名。無効な QName {example/one/field} )。どこが間違っていますか?

4

1 に答える 1

2

あなたの現在のマークアップでは、XSLT をきれいに使う方法はないと思います。少なくとも、ユーザーと XSLT プロセッサのシリアライザーが CDATA セクションとして出力する要素とそうでない要素を区別できるようにするには、異なる要素名または異なる名前空間を使用する必要があります。

または、disable-output-escaping の使用を検討する必要があります。

<xsl:template match="one/field | three/field">
  <xsl:copy>
    <xsl:text disable-output-escaping="yes"><![CDATA[<![CDATA[]]></xsl:text>
    <xsl:value-of select="."/>
    <xsl:text disable-output-escaping="yes">]]&gt;</xsl:text>
  </xsl:copy>
</xsl:template>

[編集] 完全なサンプル スタイルシートは次のとおりです。

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="@* | node()">
  <xsl:copy>
    <xsl:apply-templates select="@* | node()"/>
  </xsl:copy>
</xsl:template>

<xsl:template match="one/field | three/field">
  <xsl:copy>
    <xsl:text disable-output-escaping="yes"><![CDATA[<![CDATA[]]></xsl:text>
    <xsl:value-of select="."/>
    <xsl:text disable-output-escaping="yes">]]&gt;</xsl:text>
  </xsl:copy>
</xsl:template>

</xsl:stylesheet>

ただし、disable-output-escaping はオプションのシリアル化機能であり、すべての XSLT プロセッサでサポートされているわけではないことに注意してください。

于 2012-05-28T10:07:19.053 に答える