Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/86.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何在xslt转换中禁用html uri转义?_Php_Html_Xml_Xslt_Uri - Fatal编程技术网

Php 如何在xslt转换中禁用html uri转义?

Php 如何在xslt转换中禁用html uri转义?,php,html,xml,xslt,uri,Php,Html,Xml,Xslt,Uri,需求是将数据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

需求是将数据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}}等

如何避免编码,使我们现有的代码可以工作

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>
在这种情况下应该能帮你

具体来说,使用

总结评论:

<xsl:element name="a">
    <xsl:attribute name="href">
        <xsl:value-of select="/url" disable-output-escaping="yes"/>
    </xsl:attribute>
</xsl:element>

这不是输出转义的问题,而是url编码的问题。之所以这样做,是因为libxml2识别出这是一个href,并对url进行所需的百分比编码

简而言之,这不在xslt模板的控制之下。您需要通过后处理来修复它

这应该涵盖这一情况,但可能还有libxml2%编码的其他属性

$xformed = $proc->transformToDoc($xslDoc);
$xp = new DOMXPath($xformed);
$urls = $xp->query('descendant::a/@href');
foreach ($urls as $url) {
    $url->value = urldecode($url->value);
}

这不是输出转义的问题,而是url编码的问题。之所以这样做,是因为libxml2识别出这是一个href,并对url进行所需的百分比编码

简而言之,这不在xslt模板的控制之下。您需要通过后处理来修复它

这应该涵盖这一情况,但可能还有libxml2%编码的其他属性

$xformed = $proc->transformToDoc($xslDoc);
$xp = new DOMXPath($xformed);
$urls = $xp->query('descendant::a/@href');
foreach ($urls as $url) {
    $url->value = urldecode($url->value);
}

xsl:output中的XSLT 2.0中有一个开关,用于禁用URL属性值的%HH编码,但不幸的是,您使用的是XSLT 1.0,它没有等价物


一种方法可能是管道,首先转换为XML,然后执行填充占位符的现有代码,即{value1}}等,然后转换为HTML。

xsl:output中的XSLT 2.0中有一个开关,用于禁用URL属性值的%HH编码,但不幸的是,您使用的是XSLT 1.0,它没有等效项


一种方法可能是管道,首先转换为XML,然后执行现有代码,填充占位符,即{value1}}等,然后转换为HTML。

您是否尝试过在XML模板中没有CDATA块,但参数字符串中正确编码为&;的情况下执行此操作;?只是想知道您是否会遇到同样的问题?可能重复的您是否尝试过在XML模板中不使用CDATA块,但在参数字符串中正确编码为&;?只是想知道是否会遇到同样的问题?禁用输出转义=yes的可能重复对于xsl:text节点来说是很好的。但是,我不能在xsl:attribute节点中使用in。你能告诉我怎么做吗?嗯,没错。所以对你来说,我已经试过了,但似乎没有帮助。输出仍然是编码的。Arar,这是因为我尝试了其他方法:使用标记。因此,您可以用上面的说明更新答案,然后我可以标记它。disable output escaping=yes对于xsl:text节点很好。但是,我不能在xsl:attribute节点中使用in。你能告诉我怎么做吗?嗯,没错。所以对你来说,我已经试过了,但似乎没有帮助。输出仍然是编码的。Arar,这是因为我尝试了其他方法:使用标记。因此,你能用上面的澄清更新答案,然后我可以标记它。