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

基于XSLT 1.0根据credit/debit标签值更新XML的CDATA金额标签

XSLT 1.0 替换CDATA内的标签

示例输入XML

<request>
  <xml><![CDATA[<transaction>
    <amount>$118.23</amount>
    <description>Payment for services</description>
  </transaction>]]></xml>
  <credit>Y</credit>
  <debit>N</debit>
</request>

解决方案XSLT代码

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns:exsl="http://exslt.org/common"
                exclude-result-prefixes="exsl">

  <!-- 复制整个XML结构,仅处理需要修改的节点 -->
  <xsl:template match="/ | node() | @*">
    <xsl:copy>
      <xsl:apply-templates select="node() | @*"/>
    </xsl:copy>
  </xsl:template>

  <!-- 专门处理<xml>节点,解析并修改CDATA内的内容 -->
  <xsl:template match="xml">
    <xsl:copy>
      <!-- 将CDATA文本解析为可操作的XML节点集 -->
      <xsl:variable name="parsedContent">
        <xsl:value-of select="." disable-output-escaping="yes"/>
      </xsl:variable>
      <xsl:variable name="contentNodes" select="exsl:node-set($parsedContent)/*"/>

      <!-- 根据credit/debit的值确定新标签名 -->
      <xsl:variable name="targetTag">
        <xsl:choose>
          <xsl:when select="../credit = 'Y'">credit</xsl:when>
          <xsl:when select="../debit = 'Y'">debit</xsl:when>
          <xsl:otherwise>amount</xsl:otherwise>
        </xsl:choose>
      </xsl:variable>

      <!-- 重新包裹处理后的内容为CDATA(如果不需要CDATA可移除这两行) -->
      <xsl:text disable-output-escaping="yes"><![CDATA[<![CDATA[]]></xsl:text>
      <xsl:apply-templates select="$contentNodes">
        <xsl:with-param name="newTag" select="$targetTag"/>
      </xsl:apply-templates>
      <xsl:text disable-output-escaping="yes">]]></xsl:text>
    </xsl:copy>
  </xsl:template>

  <!-- 替换<amount>标签为指定的新标签 -->
  <xsl:template match="amount">
    <xsl:param name="newTag"/>
    <xsl:element name="{$newTag}">
      <xsl:apply-templates select="node() | @*"/>
    </xsl:element>
  </xsl:template>

  <!-- 传递参数处理其他节点 -->
  <xsl:template match="*[not(local-name()='amount')]">
    <xsl:param name="newTag"/>
    <xsl:copy>
      <xsl:apply-templates select="node() | @*">
        <xsl:with-param name="newTag" select="$newTag"/>
      </xsl:apply-templates>
    </xsl:copy>
  </xsl:template>

</xsl:stylesheet>

示例输出(当credit="Y"时)

<request>
  <xml><![CDATA[<transaction>
    <credit>$118.23</credit>
    <description>Payment for services</description>
  </transaction>]]></xml>
  <credit>Y</credit>
  <debit>N</debit>
</request>

关键说明

  • CDATA解析与转换:利用exsl:node-set()扩展函数将CDATA文本转换为可操作的XML节点集,这是XSLT 1.0处理动态XML内容的标准方案(主流处理器如Saxon、libxslt均支持)。
  • 动态标签替换:通过xsl:choose根据上层credit/debit的值动态确定替换后的标签名,传递给处理amount节点的模板。
  • CDATA保留:如果不需要输出时保留CDATA格式,直接移除包裹处理后内容的<xsl:text>节点即可,处理后的XML会直接作为普通节点输出。
  • 优先级控制:当前逻辑优先处理credit="Y"的情况,若需要优先处理debit,调整xsl:choose中条件的顺序即可。

内容的提问来源于stack exchange,提问作者user3115097

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 18:34:54