7

アップデート:

以前とまったく同じではありませんが、問題は引き続き発生します。以下は、入力されているもの、出力されているもの、出力したいものの例です。

入力の例:

<p><span style="font-size: medium">Product description text</span></p>

現在の出力:

<p><span style="font-size: medium">Product description text</span></p>

意図した出力:

<p><span style="font-size: medium">Product description text</span></p>

CDATAを使用すると、「<」を入力できるので役立ちますが、上記の出力に見られるように、disable-output-escapingを使用している場合でも、出力が変更されています。

元の質問:

私が得ているエラーは、「'<'、16進値0x3C、無効な属性文字です」です。

私がやろうとしているのは、&lt;のすべての出現箇所を置き換えることです。および&gt; それぞれ<と>で。

これをできるだけ単純にするために、ここにlt;のコードを示します。

<xsl:variable name="lt">
  <xsl:text><</xsl:text>
</xsl:variable>
<xsl:variable name="lthex">&amp;lt;</xsl:variable>
<xsl:copy-of select="ew:replacestring(products_description/node(),$lthex,$lt)"/>

テキストの代わりに、value-ofなどのさまざまなことを試しました。

コード形式とそれにリンクされているvbコードに問題はないことを知っています。これは、他の場所で置き換えて出力するために複数回使用しているためです。

ただし、これに伴う問題は、<と>を文字通り出力することであり、ブラウザで表示されて変更されるコードではないことです。

さらに詳しい情報が必要な場合は、質問してください(これをうまく説明するのに苦労しています)

どんな助けでもありがたいです

4

3 に答える 3

11
<xsl:text disable-output-escaping="yes"><![CDATA[<]]></xsl:text>

これは<違法であるためです (そして、それがあなたのアプリが不平を言っている理由です)。の場合>、次を使用できます。

<xsl:text disable-output-escaping="yes">></xsl:text>
于 2011-07-12T11:49:22.150 に答える
5

元の問題

入力の例:

&amp;lt;p&amp;gt;&amp;lt;span style=&amp;quot;font-size: medium&amp;quot;&amp;gt;Product description text&amp;lt;/span&amp;gt;&amp;lt;/p&amp;gt;

意図した出力:

<p><span style="font-size: medium">Product description text</span></p>

あなたが実際に持っているように見えるのは二重にエスケープされた入力であるため、単純にテキストを出力するのではなく、disable-output-escaping="yes"文字列を置き換えるいくつかの方法が必要です。ew:replacestring()明らかに拡張機能で置き換えを行っているようです。問題は、 に置き換えることができたとしても&amp;lt;<結果は文字列のみであり、<出力時に文字がエスケープされることです。

元の置換テキスト コードは、マークアップとして認識されるため、整形式ではありませんでした<。使用する

<xsl:variable name="lt">
  <xsl:text><![CDATA[<]]></xsl:text>
</xsl:variable>

また

<xsl:variable name="lt">
  <xsl:text>&lt;</xsl:text>
</xsl:variable>

同等であり、その問題を修正します。ただし、これは置換文字がまだエンティティ参照として出力されるという問題には役立ちません。disable-output-escaping="yes"変数定義でここを使用しても、その問題には影響しません。

<xsl:variable name="lt">
  <xsl:text disable-output-escaping="yes">&lt;</xsl:text>
</xsl:variable>

<xsl:variable name="lt">
  <xsl:value-of select="&lt;" disable-output-escaping="yes">
</xsl:variable>

これらのコード例はdisable-output-escaping="yes"、変数が割り当てられたときではなく、値がシリアル化されたときにのみ効果があるため、機能しません。

可能な修正

あなたがしようとすることができるのは、テキスト置換の結果を変数に格納することです

<xsl:variable name="replaced-text">
    <xsl:copy-of select="ew:replacestring(products_description/node(),$lthex,$lt)"/>
</xsl:variable>

次に、この変数の値を出力しますdisable-output-escaping="yes"

<xsl:value-of select="$replaced-text" disable-output-escaping="yes"/>

拡張機能のない別のソリューション

入力を変換できました

&amp;lt;p&amp;gt;&amp;lt;span style=&amp;quot;font-size: medium&amp;quot;&amp;gt;Product description text&amp;lt;/span&amp;gt;&amp;lt;/p&amp;gt;

この出力に

<p><span style="font-size: medium">Product description text</span></p>

Jeni Tennison の頭字語置換テンプレートのわずかに変更されたバージョンを使用します。あなたの場合、頭字語のタイトルを含むドキュメントは次のようになります

<acronyms>
    <acronym acronym="&amp;lt;">&lt;</acronym>
    <acronym acronym="&amp;gt;">></acronym>
    <acronym acronym="&amp;amp;">&amp;</acronym>
    <acronym acronym="&amp;apos;">'</acronym>
    <acronym acronym="&amp;quot;">"</acronym>
</acronyms>

必要な変更は、コード例のこの部分を変更することです

<acronym title="{$acronyms[1]}">
    <xsl:value-of select="$acronym" />
</acronym>

このように見える

<xsl:value-of select="$acronyms[1]" disable-output-escaping="yes"/>

このテンプレートは XSLT 1.0 であり、拡張機能を必要としないため、すべての環境で機能するはずです。

于 2011-07-13T13:25:14.807 に答える
0

編集: XML または HTML シリアライゼーションの代わりに、XML または HTML シリアライゼーションのシリアライゼーションを入力として取得しようとしているように見えますが、XML または HTML シリアライゼーションを出力することを期待していますか?

正しいことは、壊れた入力を修正することですが、XSLT を使用して XML 文字をエスケープ解除する方法を参照してください。


ここである種の誤解があります。XSL は XML を入力として受け取り、HTML または XML を出力します。シリアライズされた HTML および XML<として表されます。&lt;

<タグを開始しないを含む HTML または XML ファイルは、不適切なシリアル化です (整形式ではありません)。

&lt;<HTML または XML ファイルでの の正しい表現です。

HTML または XML ファイルは、それが表すデータのシリアル化にすぎません。つまり、それが表すデータの 1 レベル下にあります。<HTML または XML のコンテンツは、データのシリアル化 ( ) ではなく 、データが表すもの ( ) と考える必要があります&lt;

&lt;誤解を正すことができるように、所有することが問題だと思う理由を説明してみてください。

于 2011-07-13T13:36:59.590 に答える