Php 如何在xslt转换中禁用html uri转义?
需求是将数据xml文件转换为html模板,然后使用该模板生成实际页面,嵌入到电子邮件中 让我们看一下下面的例子: XML数据文件test.XML: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 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&%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,这是因为我尝试了其他方法:使用标记。因此,你能用上面的澄清更新答案,然后我可以标记它。