如何用XSLT合并XML元素的attrib属性值与元素内容?
如何将XML元素的attrib属性值与元素内容合并?
输入XML
<Files> <File> <Data1> <item attrib="Old">value1</item> </Data1> <Data2 attrib="Old"/> <Data3> <item attrib="New">value2</item> </Data3> </File> <File attrib="New"> <Data1> <item2> <item3 attrib="Old">value3</item3> </item2> </Data1> </File> <File attrib="New"> <Data1> <item attrib="Old">value1</item> </Data1> </File> </Files>
需求说明
匹配所有attrib属性值为"Old"且包含非空文本内容的元素,将属性值与元素内容以“-”连接(例如Old-value1);空元素或attrib属性值不为"Old"的元素保持原样。
期望输出XML
<Files> <File> <Data1> <item attrib="Old">Old-value1</item> </Data1> <Data2 attrib="Old"/> <Data3> <item attrib="New">value2</item> </Data3> </File> <File attrib="New"> <Data1> <item2> <item3 attrib="Old">Old-value3</item3> </item2> </Data1> </File> <File attrib="New"> <Data1> <item attrib="Old">Old-value1</item> </Data1> </File> </Files>
当前XSLT模板问题
当前使用的模板仅将元素内容替换为属性值,未实现合并:
<xsl:template match="*[@attrib='Old' and normalize-space(.)]"> <xsl:copy> <xsl:apply-templates select="@*" /> <xsl:value-of select="@attrib" separator="-"/> </xsl:copy> </xsl:template>
生成的输出中,目标元素内容仅保留了Old,丢失了原文本内容。
修正后的XSLT代码
要实现合并功能,需要调整内容生成逻辑,同时保留身份转换模板以维持原XML结构:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <!-- 身份转换模板:保留所有未被匹配的节点 --> <xsl:template match="@*|node()"> <xsl:copy> <xsl:apply-templates select="@*|node()"/> </xsl:copy> </xsl:template> <!-- 匹配attrib="Old"且非空的元素,合并属性值与内容 --> <xsl:template match="*[@attrib='Old' and normalize-space(.)]"> <xsl:copy> <xsl:apply-templates select="@*" /> <!-- 拼接属性值和元素文本内容,用“-”分隔 --> <xsl:value-of select="concat(@attrib, '-', normalize-space(.))"/> <!-- 若使用XSLT 2.0及以上,也可以用更简洁的写法: <xsl:value-of select="@attrib, normalize-space(.)" separator="-"/> --> </xsl:copy> </xsl:template> </xsl:stylesheet>
修正说明
- 添加身份转换模板:确保所有未被自定义模板匹配的节点(包括其他元素、属性、空元素、文本)都能原样保留,避免原XML结构被破坏。
- 调整内容拼接逻辑:使用
concat()函数将@attrib的值、分隔符“-”和元素的标准化文本内容合并;如果使用XSLT 2.0及以上版本,也可以用xsl:value-of同时选择两个值并指定分隔符,写法更简洁。 - 保留空元素处理:空元素因
normalize-space(.)结果为空,不会被自定义模板匹配,因此保持原空元素<Data2 attrib="Old"/>的状态。
内容的提问来源于stack exchange,提问作者demi
相关产品推荐
相关产品推荐

