1

要件は、データ xml ファイルを html テンプレートに変換し、このテンプレートを使用して実際のページを生成し、電子メールに埋め込むことです。

それでは、次の例を見てみましょう。

XML データ ファイル (test.xml):

<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/xsl" href="test.xslt"?>
<url><![CDATA[http://www.example.net/testurl/{{value1}}?{{value2}}&{{value3}}]]></url>

XSLT ファイル (test.xslt):

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="html" indent="yes" version="1.0"/>
  <xsl:template match="/">
    <html>
    <head>
    </head>
    <body>
        <a>
            <xsl:attribute name="href">
              <xsl:value-of select="/url" />
            </xsl:attribute>
            Click
        </a>
    </body>
    </html>
  </xsl:template>
</xsl:stylesheet>

サーバースクリプト (test.php)

<?php
   $xslDoc = new DOMDocument();
   $xslDoc->load("test.xslt");

   $xmlDoc = new DOMDocument();
   $xmlDoc->load("test.xml");

   $proc = new XSLTProcessor();
   $proc->importStylesheet($xslDoc);
   echo $proc->transformToXML($xmlDoc);
?>

上記の .php ファイルを実行すると、結果は次のようになります。

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
<html>
<head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"></head>
<body><a href="http://www.example.net/testurl/%7B%7Bvalue1%7D%7D?%7B%7Bvalue2%7D%7D&amp;%7B%7Bvalue3%7D%7D">
            Click
        </a></body>
</html>

プロパティがエンコードされていることに注意してください。これは、プレースホルダー (つまり、など)hrefを埋める既存のコードと互換性がありません。{{value1}}

既存のコードが機能するようにエンコーディングを回避するにはどうすればよいですか?

4

3 に答える 3

3

これは出力エスケープの問題ではなく、url エンコーディングの問題です。これが行われるのは、libxml2 がこれを認識hrefし、URL に対して必要なパーセント エンコーディングを実行するためです。

簡単に言えば、これは xslt-template の制御下にないということです。後処理で修正する必要があります。

これはケースをカバーするはず<a href="">ですが、libxml2 がパーセント エンコードする他の属性があるかもしれません。

$xformed = $proc->transformToDoc($xslDoc);
$xp = new DOMXPath($xformed);
$urls = $xp->query('descendant::a/@href');
foreach ($urls as $url) {
    $url->value = urldecode($url->value);
}
于 2013-01-10T23:51:13.573 に答える
2

XSLT 2.0 (xsl:output) には、URL 属性値の %HH エンコードを無効にするスイッチがありますが、残念ながら XSLT 1.0 を使用しているため、同等のものはありません。

1 つのアプローチは、最初に XML に変換し、次に「プレースホルダー ({{value1}} など) を埋める既存のコード」を実行し、次に HTML に変換するパイプラインです。

于 2013-01-11T09:24:16.253 に答える
-2
disable-output-escaping="yes"

この場合、あなたを助けるはずです。

具体的には、このように使用されます。

コメントを要約すると:

<xsl:element name="a">
    <xsl:attribute name="href">
        <xsl:value-of select="/url" disable-output-escaping="yes"/>
    </xsl:attribute>
</xsl:element>
于 2013-01-10T23:31:19.933 に答える