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 模板的控制。您将需要通过后处理对其进行修复。

这应该涵盖这种<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,它没有等效项。

一种方法可能是首先转换为 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 回答