如何用XSLT输出XML元素标签内的所有属性值?
如何用XSLT输出元素的所有属性值
我查到的XSLT相关方案大多是输出节点及子节点的值,但我想了解如何输出元素标签内的所有属性值。这么做的原因是我有大量属性值,将它们放在元素标签内比创建多层子节点更便捷。
XML示例
<data> <info> <catalog Id="1111" Locale="en_GB"> <books> <book id="01" Name="Title 1" Author="John Doe"></book> <book id="02" Name="Title 2" Author="Jane Doe"></book> </books> </catalog> </info> </data>
当前XSLT代码
<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="/"> <html> <body> <xsl:for-each select="data/info/catalog"> <xsl:value-of select="@Id" /> <xsl:value-of select="/books/book/@Name"/> </xsl:for-each> </body> </html> </xsl:template> </xsl:stylesheet>
期望输出
Catalog Id: 1111 Attributes: id: 01 Name: Title 1 Author: John Doe id: 02 Name: Title 2 Author: Jane Doe
解决方案
要实现输出所有属性值,核心是使用@*匹配元素的所有属性,再结合遍历逻辑输出属性名和对应值。以下是调整后的XSLT代码:
<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <!-- 设置输出为纯文本,匹配期望格式 --> <xsl:output method="text" encoding="UTF-8"/> <xsl:template match="/"> <!-- 遍历每个catalog --> <xsl:for-each select="data/info/catalog"> <!-- 输出catalog的Id属性 --> <xsl:text>Catalog Id: </xsl:text> <xsl:value-of select="@Id"/> <xsl:text> Attributes: </xsl:text> <!-- 遍历当前catalog下的所有book元素 --> <xsl:for-each select="books/book"> <!-- 遍历当前book的所有属性 --> <xsl:for-each select="@*"> <!-- 输出属性名和值 --> <xsl:value-of select="name()"/> <xsl:text>: </xsl:text> <xsl:value-of select="."/> <xsl:text> </xsl:text> </xsl:for-each> <!-- 不同book之间换行分隔 --> <xsl:text> </xsl:text> </xsl:for-each> </xsl:for-each> </xsl:template> </xsl:stylesheet>
关键说明
- 输出格式设置:通过
<xsl:output method="text"/>指定输出为纯文本,避免生成HTML标签,贴合期望的文本格式。 - 匹配所有属性:使用
@*可以选中当前元素的所有属性,无需逐个指定属性名,适合属性数量多的场景。 - 属性名获取:用
name()函数获取当前属性的名称,结合value-of select="."获取属性值,实现动态输出所有属性。 - 路径修正:在catalog的遍历中,选择
books/book是相对路径,确保能正确找到当前catalog下的子元素,避免原代码中绝对路径/books/book的错误。
内容的提问来源于stack exchange,提问作者user19947827
相关产品推荐
相关产品推荐

