如何在xsl:output中为特定路径的urn:data元素指定CDATA区段?
特定路径下
urn:data的CDATA控制方案 由于<xsl:output>的cdata-section-elements仅支持指定元素名称,无法通过路径筛选,要实现部分urn:data生成CDATA、部分不生成的需求,需放弃全局配置,改用模板匹配手动处理:
1. 移除全局CDATA配置
先删除原输出配置里的cdata-section-elements="urn:data",避免全局自动生成CDATA:
<xsl:output method="xml"/>
2. 为目标路径的urn:data编写CDATA生成模板
匹配urn:OperatorSpecificData/urn:data节点,手动输出标准CDATA区段,同时保留节点属性:
<xsl:template match="urn:OperatorSpecificData/urn:data"> <xsl:copy> <!-- 复制节点所有属性 --> <xsl:copy-of select="@*"/> <!-- 输出CDATA起始标记,禁用转义确保标记不被转义 --> <xsl:text disable-output-escaping="yes"><![CDATA[<![CDATA[</xsl:text> <!-- 输出节点内容 --> <xsl:value-of select="."/> <!-- 输出CDATA结束标记 --> <xsl:text disable-output-escaping="yes">]]></xsl:text> </xsl:copy> </xsl:template>
3. 为其他urn:data编写默认输出模板
匹配剩余的urn:data节点,正常输出内容(自动转义特殊字符,不生成CDATA):
<xsl:template match="urn:data"> <xsl:copy> <xsl:copy-of select="@*"/> <xsl:value-of select="."/> </xsl:copy> </xsl:template>
关键说明:避免CDATA特性丢失
你担心的自定义替换会变成转义字符串的问题,只要通过disable-output-escaping="yes"控制,就能让XSLT处理器直接输出CDATA的原始标记,而非将<、>转义成实体引用,最终生成的XML里是标准的CDATA区段,不会丢失特性。
特殊场景处理
如果urn:data的内容包含]]>(CDATA结束标记),直接输出会破坏结构,需提前替换:
<xsl:template match="urn:OperatorSpecificData/urn:data"> <xsl:copy> <xsl:copy-of select="@*"/> <xsl:text disable-output-escaping="yes"><![CDATA[<![CDATA[</xsl:text> <!-- 替换内容中的]]>,避免破坏CDATA结构 --> <xsl:value-of select="replace(., ']]>', ']]]]><![CDATA[>')"/> <xsl:text disable-output-escaping="yes">]]></xsl:text> </xsl:copy> </xsl:template>
(注:replace函数需XSLT 2.0及以上支持,XSLT 1.0可通过递归模板实现替换)
内容的提问来源于stack exchange,提问作者MrD at KookerellaLtd
相关产品推荐
相关产品推荐

