PHP内置XSLTProcessor属性中双大括号被转单大括号问题求助
解决XSLTProcessor属性中双大括号被转义的问题
原因说明
这是XSLT 1.0的规范行为:当属性值属于属性值模板时,{{会被解析为单个{(用来转义属性值中的特殊字符{),而元素内容中的纯文本{{不属于属性值模板的解析范围,因此不会被修改。
解决思路
1. 预处理XSL DOM,替换属性中的双大括号
加载XSL文件到DOMDocument后,遍历所有属性节点,将属性值中的{{替换为{{{{,}}替换为}}}}。这样XSLT处理器解析时,每两个{会被转义为一个{,最终输出就会保留原有的{{...}}格式。
示例代码:
$xsldoc = new DOMDocument(); $xsldoc->loadXML('<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"><xsl:template match="alma"><korte malna="{{keres_keres}}">{{keres_keres}}</korte></xsl:template></xsl:stylesheet>'); // 遍历所有属性节点,替换双大括号 $xpath = new DOMXPath($xsldoc); $attributes = $xpath->query('//@*'); foreach ($attributes as $attr) { $attr->value = str_replace(['{{', '}}'], ['{{{{', '}}}}'], $attr->value); } $xslproc = new XSLTProcessor(); $xslproc->importStyleSheet($xsldoc); $xmldoc = new DOMDocument(); $xmldoc->loadXML('<?xml version="1.0" encoding="UTF-8"?><alma/>'); $xmlout = $xslproc->transformToXML($xmldoc); // 输出结果:<korte malna="{{keres_keres}}">{{keres_keres}}</korte> echo htmlspecialchars($xmlout);
2. 对转换结果进行后处理
如果预处理XSL DOM的方式不可行,可以在转换完成后,对输出的XML字符串进行正则替换,将属性值中的{...}还原为{{...}}。需要注意正则匹配的准确性,避免误替换原本就是单大括号的内容。
示例代码:
// ... 原转换代码 ... $xmlout = $xslproc->transformToXML($xmldoc); // 正则替换属性中的单大括号为双大括号 $xmlout = preg_replace('/(\w+)="{([^}]+)}"/', '$1="{{$2}}"', $xmlout); echo htmlspecialchars($xmlout);
注意:这个正则仅适用于属性值是
{xxx}格式的场景,如果属性值包含其他特殊字符或复杂结构,需要调整正则表达式以适配。
内容的提问来源于stack exchange,提问作者mistvan
相关产品推荐
相关产品推荐

