4

XSLTを使用して&nbsp;、XMLファイルから特殊文字(など)を含むHTMLコンテンツを抽出しています。コンテンツは<content>ノードに保存されます。私は次のようなほとんどの特殊文字を定義しました:<!ENTITY nbsp "&#160;">、したがって、この式は完全にうまく機能します:

<xsl:copy-of select="content" disable-output-escaping="yes"/>

target="_blank" ここで、そのコンテンツ内にあるすべてのリンクに追加したいと思います。これは私が思いついた解決策です:

<xsl:template match="a" mode="html">
    <a>
        <xsl:attribute name="href"><xsl:value-of select="@*"/></xsl:attribute>
        <xsl:attribute name="target">_blank</xsl:attribute>
        <xsl:apply-templates select="text()|* "/>
    </a>
</xsl:template>

そして、「copy-of」要素の代わりに、これを使用します。

<xsl:apply-templates select="content" mode="html"/>

これで、これらの特殊文字(およびnbspも)がすべて出力から消えました。どうすればそれらを保持できますか?disable-output-escaping="yes"ここでは役に立たないようです。

わかりました。PHPでXSLTProcessorクラスを使用しています。属性は実際にはエラーを出しませんでしたdisable-output-escapingが、それを削除したとき、出力はすべてのnbspで同じだったので、問題ではありませんでした。


UPD。前に示したXSLテンプレートを使用して、入力サンプルは次のようになります。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE page SYSTEM "html-entities.xsl">
<content>There is a&nbsp;non-breaking <a href="http://localhost">space</a> inside.</content>

html-entities.xsl:

<?xml version="1.0" encoding="UTF-8"?>
<!ENTITY nbsp "&#160;">

PHPコード:

$xp = new XSLTProcessor();
$xsl = new DOMDocument();
$xsl->load($xsl_filename);
$xp->importStylesheet($xsl);
$xml_doc = new DOMDocument();
$xml_doc->resolveExternals = true;
$xml_doc->load($xml_filename);
$html = $xp->transformToXML($xml_doc);

私の現在の出力:

There is anon-breaking <a href="http://localhost" target="_blank">space</a> inside.

私の希望する出力:

There is a&nbsp;non-breaking <a href="http://localhost" target="_blank">space</a> inside.

4

1 に答える 1

0

基本的に、入力 XML ドキュメントのソース コードに文字参照&#160;やエンティティ参照&nbsp;などの文字が含まれているかどうかは、XSLT にとっては文字通り重要ではなく、入力がどのように処理され、出力がどのように見えるかに違いはありません。基本的に、XSLT は、テキスト ノードに格納された Unicode 文字を含むツリー上で動作します。少なくともそれが理論です。あなたの PHP コードは、エンティティ参照ノードを格納する可能性のある DOM ツリー モデルで動作するようですが、それでも XSLT では問題にならないはずです。入力ツリーには、Unicode 文字 (Unicode 160 の非改行スペース文字である可能性がある場合) を含むテキスト ノードが必要であり、そのようなテキストを出力にコピーすると、結果ツリーには同じ Unicode 文字のテキスト ノードが含まれます。 .

出力メソッドの場合、html一部の XSLT プロセッサ (たとえば、Saxon 6.5.5) では、HTML でエンティティとして定義された文字が対応するエンティティ参照でシリアル化されることを保証することができますが、そうしない場合でも、結果ツリーのシリアル化は行われません。要素のencoding属性によって指示されるようにエンコードされた、適切な Unicode 文字を含むファイルである必要がありますxsl:output

キャラクターを完全に削除する現在の結果(例:There is anon-breaking)は、私には意味がありません。

于 2012-09-26T12:04:30.340 に答える