如何用XSL在属性Y为'A'/'B'/'F'时修改属性X的值?
简单XSLT方案:修改指定条件下的XML属性
嘿,我懂你这种平时不怎么碰XML,一碰到XSL就头大的感觉!别担心,咱们用最基础的XSLT写法就能解决你的需求——核心思路就是先原样复制所有XML内容,只对符合条件的元素修改属性,不用搞复杂的语法。
先把你的简化XML补全成带属性的示例(方便演示):
<t6:Catalogue xmlns:t6="http://xxx.yy.com"> <t6:Items> <t6:Item X="old_x_1" Y="A" /> <t6:Item X="old_x_2" Y="C" /> <t6:Item X="old_x_3" Y="B" /> <t6:Item X="old_x_4" Y="F" /> </t6:Items> </t6:Catalogue>
接下来是专门针对你需求的XSLT代码:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:t6="http://xxx.yy.com"> <!-- 身份模板:原样复制所有节点和属性 --> <xsl:template match="@*|node()"> <xsl:copy> <xsl:apply-templates select="@*|node()"/> </xsl:copy> </xsl:template> <!-- 匹配Y属性为'A'/'B'/'F'的t6:Item元素,修改X属性 --> <xsl:template match="t6:Item[@Y='A' or @Y='B' or @Y='F']"> <xsl:copy> <!-- 复制所有原有属性,除了X --> <xsl:apply-templates select="@*[name()!='X']"/> <!-- 重新设置X属性的值,这里替换成你需要的内容 --> <xsl:attribute name="X">new_x_value</xsl:attribute> </xsl:copy> </xsl:template> </xsl:stylesheet>
代码说明:
- 第一个模板是身份模板,是XSLT的基础操作,它会把XML里所有没被特殊匹配的节点/属性原封不动复制下来,这样我们只需要关注要修改的部分。
- 第二个模板专门匹配
Y属性是'A'、'B'或'F'的t6:Item元素:- 先复制这个元素本身
- 复制它所有原有属性,但是排除
X属性 - 重新添加
X属性,设置成你需要的新值(把new_x_value换成你的目标值就行)
转换后的输出示例:
<t6:Catalogue xmlns:t6="http://xxx.yy.com"> <t6:Items> <t6:Item Y="A" X="new_x_value" /> <t6:Item X="old_x_2" Y="C" /> <t6:Item Y="B" X="new_x_value" /> <t6:Item Y="F" X="new_x_value" /> </t6:Items> </t6:Catalogue>
实用提示:
- 注意命名空间:你的XML用了
t6命名空间,所以XSLT里必须声明完全相同的xmlns:t6="http://xxx.yy.com",不然匹配不到目标元素。 - 如果你的目标元素不是
t6:Item(比如是t6:Mapp?你原来的XML没写完),只需要把模板里的t6:Item改成对应的元素名就行。 - 运行方式:你可以用免费的在线XML/XSLT转换工具直接测试,或者用Python的
lxml库、Java的XSLT处理器这类本地工具批量处理。
内容的提问来源于stack exchange,提问作者isaw
相关产品推荐
相关产品推荐

