基于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
相关产品推荐
相关产品推荐

