如何使用XSLT将XML元素的每个属性换行输出?
XSL实现XML元素属性单独换行的方案
要让XML元素的每个属性单独换行输出,需要自定义元素的起始标签生成逻辑,替代XSLT默认的属性输出方式。以下是可行的实现方案:
核心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> <!-- 自定义元素起始标签的输出逻辑 --> <xsl:template match="*"> <!-- 输出起始标签开头:<元素名 --> <xsl:text><</xsl:text> <xsl:value-of select="name()"/> <!-- 遍历每个属性,单独换行并添加缩进 --> <xsl:for-each select="@*"> <xsl:text> </xsl:text><!-- 6个空格,匹配示例缩进格式 --> <xsl:value-of select="name()"/> <xsl:text>="</xsl:text> <xsl:value-of select="."/> <xsl:text>"</xsl:text> </xsl:for-each> <!-- 输出起始标签结尾 --> <xsl:text>></xsl:text> <!-- 处理子节点 --> <xsl:apply-templates select="node()"/> <!-- 输出结束标签 --> <xsl:text></</xsl:text> <xsl:value-of select="name()"/> <xsl:text>></xsl:text> </xsl:template> </xsl:stylesheet>
输入XML
<Pane attr1="value1" attr2="value2" attr3="value3"> <children> <title>A</title> </children> </Pane>
输出结果
<Pane attr1="value1" attr2="value2" attr3="value3"> <children> <title>A</title> </children> </Pane>
关键说明
- 身份模板负责复制除元素起始标签外的所有内容,保证子元素、文本等结构与原文档一致。
- 针对元素节点的模板手动拼接起始标签:先输出元素名,再遍历每个属性,每个属性前添加换行和对应缩进(如需调整缩进,修改代码中换行后的空格数即可)。
内容的提问来源于stack exchange,提问作者Sai Dandem
相关产品推荐
相关产品推荐

