You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 14:50:33