1

followigxmlデータがあります

<xml>
  <para> 
  <number>1</number>
             &lt;text class="text"&gt;the cost to the &lt;123; each capital property <a href="none" num="88(1)">88(1)</a> and (1.7) &lt;/text&gt;
  </para>

次の出力を与えるxsltスクリプトを実行したい

<xml>
  <para> 
  <number>1</number>
             <text class="text">the cost to the &lt;123; each capital property <a href="none" num="88(1)">88(1)</a> and (1.7) </text>
  </para>
 </xml>  

だから基本的に&lt;text class="text"&gt;<text>&lt;/text&gt;置き換えます</text>

このようなチャーターマッピングを使うことを考えました

<xsl:character-map name="a">
<xsl:output-character character="&lt;" string="&lt;"/>
<xsl:output-character character="&gt;" string=">"/>
</xsl:character-map>

しかし、このアプローチの問題は、すべてを変換し&lt;<、上記のように置き換えたくないという問題を引き起こすことです。&lt;123;

4

1 に答える 1

3

エスケープされたXMLを含むテキストノードに対して、「解析」ステップを1つ追加するか、(同等に)「エスケープ」ステップを削除します...特定&lt;のsを除きます。

手っ取り早い方法は、これらのテキストノードでdisable-output-escaping(DOE)を使用して、「エスケープ」ステップを削除することです。「contains(。、'<')」のようなテストを使用して、シリアル化中にエスケープ解除するテキストノードを決定できます。

ただし、さまざまな理由から、DOEは推奨されないことがよくあります。理由の1つは、必ずしも移植性があるとは限らないことです。XSLTプロセッサはそれを尊重する必要はなく、一部のプロセッサはそれを尊重する必要がありません。もう1つの理由は、XMLを非XMLテキストとして(ツリーではなく文字列を使用して)処理しながら、XMLを出力しようとしていることです。これを行うと、必要なものとプロセッサが実行するものとの間に不一致が生じることになります。

&lt;また、DOEは、エスケープしたくないインスタンスと、エスケープしたくないインスタンスがあるという問題を解決しません。すべてのインスタンスをエスケープ解除します。

より堅牢な答えは、XSLTで文字列を実際のXMLノードに解析してから、これらを出力することです。理論的には、を使用してXSLTでこれを行うことができます<xsl:analyze-string>。ただし、別の言語で記述したカスタム拡張関数を使用した方がよい場合があります(ここを参照)。saxon:parse()入力テキストは整形式のXMLではないため、入力テキストを前処理しない限り、XSLTでXMLを解析するための既存の実装(拡張関数など)は機能しないと思います。

これを正常に実装するに&lt;は、データ内のをXMLマークアップとして解釈するかどうかを正確に決定する方法を指定する必要があります。

于 2012-09-07T19:32:12.340 に答える