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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 03:26:05