如何用简短XSLT实现XML属性转子元素(无需预知元素名)
通用XSLT脚本:将XML属性转为子元素
以下是一段通用XSLT脚本,无需预先知晓XML元素名称,即可把所有元素的属性转换为对应子元素,同时保留原有子元素结构:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <!-- 复制所有元素节点,处理属性转子元素逻辑 --> <xsl:template match="*"> <xsl:element name="{name()}"> <!-- 遍历当前元素的所有属性,转为子元素 --> <xsl:for-each select="@*"> <xsl:element name="{name()}"> <xsl:value-of select="."/> </xsl:element> </xsl:for-each> <!-- 递归处理子元素,保留原有结构 --> <xsl:apply-templates/> </xsl:element> </xsl:template> <!-- 保留文本、注释、处理指令节点内容 --> <xsl:template match="text()|comment()|processing-instruction()"> <xsl:copy/> </xsl:template> </xsl:stylesheet>
脚本说明
- 第一个模板匹配所有元素节点:先复制当前元素标签,再遍历其所有属性,将属性名作为子元素名、属性值作为子元素文本内容;接着递归处理原元素的子节点,保证原有子元素结构不受影响。
- 第二个模板负责保留文本、注释和处理指令,避免内容丢失。
示例输入XML
<offers> <o id="2801" url="https://url/" price="169.14" avail="1" weight="1" stock="160" basket="1"> <cat><![CDATA[Perfumy męskie]]></cat> <name><![CDATA[4711, 4711, woda kolońska, 800 ml]]></name> <imgs> <main url="https://teewy.pl/wp-content/uploads "/> </imgs> </o> </offers>
转换后输出XML
<offers> <o> <id>2801</id> <url>https://url/</url> <price>169.14</price> <avail>1</avail> <weight>1</weight> <stock>160</stock> <basket>1</basket> <cat>Perfumy męskie</cat> <name>4711, 4711, woda kolońska, 800 ml</name> <imgs> <main> <url>https://teewy.pl/wp-content/uploads </url> </main> </imgs> </o> </offers>
内容的提问来源于stack exchange,提问作者Sylwester Zabielski
相关产品推荐
相关产品推荐

