
XSLT标准不允许使用@等非法字符构造合法QName,因此无法通过直接创建这类标签;但可通过disable-output-escaping配合纯文本输出方式绕过语法校验,手动拼接标签字符串。
xslt标准不允许使用`@`等非法字符构造合法qname,因此无法通过`
在标准XML命名规则中,元素名称必须符合QName(Qualified Name) 语法:首字符需为字母、下划线 _ 或冒号 :,后续字符可包含字母、数字、连字符 -、下划线 _、点 . 和冒号 :,但不允许以 @、#、$ 等符号开头或出现在名称中。因此,以下写法会报错:
<element name="@type"><!-- ❌ 错误:@type 不是合法 QName --><value-of select="$type"></value-of></element>
若业务场景强制要求生成形如 myType@type> 的非标准XML片段(例如对接遗留系统或特定协议),可采用 “伪XML文本输出” 方式:将输出方法设为 method="text",并利用 disable-output-escaping="yes" 告诉XSLT处理器不转义尖括号,从而手动拼接标签。
✅ 正确实现示例:
<stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"><output method="text" encoding="UTF-8"></output><!-- 假设输入为 <foo type="@type"> --><template match="foo"><!-- 输出起始标签:<@type> --><text disable-output-escaping="yes"><value-of select="@type"></value-of><text disable-output-escaping="yes">></text><!-- 输出内容体 --><value-of select="."></value-of><!-- 输出结束标签:</@type> --><text disable-output-escaping="yes"></text><value-of select="@type"></value-of><text disable-output-escaping="yes">></text></text></template></stylesheet>
输入示例:
<foo type="@type">myType</foo>
输出结果:
myType@type>
⚠️ 重要注意事项:
-
disable-output-escaping仅在xsl:output method="text"或method="html"时有效;若使用method="xml",该属性会被忽略或引发警告; - 此方式生成的不是严格意义上的XML文档(因含非法元素名),无法被标准XML解析器(如DOM、SAX)正确加载,仅适用于文本协议或下游系统明确接受此类格式的场景;
- 不同XSLT处理器对
disable-output-escaping的支持程度略有差异(如Saxon默认禁用,需显式启用),建议在目标环境中充分测试; - 长期维护角度,应优先推动下游系统适配标准XML命名规范(如改用
<attr name="@type">myType</attr>),避免技术债累积。
总结:这不是XML合规的解决方案,而是面向特定互操作需求的务实变通——用可控的“非标准输出”换取功能落地,关键在于明确约束边界与使用场景。










