如何用XSLT将category元素的id属性转为categoryid子元素
嘿,这里有两种靠谱的方法帮你完成这个XML结构转换的需求:
方法1:使用XSLT(XML原生转换方案)
这是处理XML结构调整最标准的方式,用下面的XSLT模板就能精准实现你的需求:
<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> <!-- 专门处理category元素的自定义模板 --> <xsl:template match="category"> <xsl:copy> <!-- 提取原id属性值,生成新的categoryid子元素 --> <categoryid><xsl:value-of select="@id"/></categoryid> <!-- 复制category下的所有子节点,自动跳过原id属性 --> <xsl:apply-templates select="node()"/> </xsl:copy> </xsl:template> </xsl:stylesheet>
简单说明:
- 第一个模板是基础,负责原样保留XML里的其他所有内容(像
<something>、<nothing>这些元素都不会被改动); - 第二个模板专门针对
<category>元素:先复制标签本身但去掉原id属性,接着生成<categoryid>子元素并填充id值,最后把原来的子节点都搬过来。
你可以用任何支持XSLT的工具(比如Saxon、Xalan,甚至在线XML转换工具)来套用这个样式表,就能得到你想要的结果。
方法2:用Python代码自动化处理
如果需要批量处理或者和其他业务逻辑结合,用Python的lxml库来实现会非常灵活,代码示例如下:
from lxml import etree # 原始XML内容 xml_content = """ <root> <category id="123"> <something id="777">987</something> <nothing>555</nothing> </category> </root> """ # 解析XML root = etree.fromstring(xml_content) # 定位到目标category元素(支持处理多个category的场景) for category in root.findall('category'): # 获取原id属性值 cat_id = category.get('id') if cat_id: # 删除原id属性 category.attrib.pop('id') # 创建新的categoryid元素并填充内容 categoryid = etree.Element('categoryid') categoryid.text = cat_id # 把新元素插入到category的最前面 category.insert(0, categoryid) # 输出格式化后的XML print(etree.tostring(root, pretty_print=True, encoding='unicode'))
运行后你会得到:
<root> <category> <categoryid>123</categoryid> <something id="777">987</something> <nothing>555</nothing> </category> </root>
这个代码还支持处理多个<category>元素的情况,要是你有一堆XML文件需要转换,稍微改改就能批量处理啦。
内容的提问来源于stack exchange,提问作者digest806
相关产品推荐
相关产品推荐

