我正在尝试使用XSLT将属性值从XML提取到JSON。
XML
<root1>
<root2>
<test attr1="123" attr2="abc"/>
</root2>
</root1>
JSON
{
"attr1":"<xsl:value-of select="root1/root2/test/[@attr1"]/>"
"attr2":"<xsl:value-of select="root1/root2/test/[@attr2"]/>"
}
我尝试了很多解决方案,但没有一个能够正常工作。 XSLT的页眉和页脚已经得到了解决。
答案 0 :(得分:2)
{
"attr1":"<xsl:value-of select="root1/root2/test/@attr1"/>"
"attr2":"<xsl:value-of select="root1/root2/test/@attr2"/>"
}
您正在使用定义谓词的[]
(例如过滤节点集),但您想要的只是获取属性值。
请注意,如果源XML具有多个要从中提取属性的XML元素,则需要将其嵌入到foreach或单独的模板中; as-is这将获取文档中所有匹配元素的所有属性。
使用以下样式表在XSLT Fiddle中进行了测试:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
<xsl:output method="text" omit-xml-declaration="yes" indent="no" />
<xsl:template match="/">{
"attr1":"<xsl:value-of select="root1/root2/test/@attr1" />"
"attr2":"<xsl:value-of select="root1/root2/test/@attr2" />"
}</xsl:template>
</xsl:stylesheet>
答案 1 :(得分:1)
编写xsl时,您应该采用最佳实践并使用模板来实现重复内容。因此,在您的示例中,您应该使用模板来转换属性,如此...
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
<xsl:template match="/">
<xsl:text>{</xsl:text>
<xsl:apply-templates select="root1/root2/test/@*"/>
<xsl:text>}</xsl:text>
</xsl:template>
<xsl:template match="@*">
<xsl:if test="position()>1"><xsl:text>,</xsl:text></xsl:if>
<xsl:text>"</xsl:text>
<xsl:value-of select="name()"/>
<xsl:text>":"</xsl:text>
<xsl:value-of select="."/>
<xsl:text>"</xsl:text>
</xsl:template>
</xsl:stylesheet>
在上面的xsl中,我使用的模板将单个属性转换为json名称/值对,apply-templates用于从root / root2.test节点中选择所有属性。
答案 2 :(得分:0)
&lt; xsl:value-of select =“root1 / root2 / test / [@ attr1]”/&gt; 当我们使用[]谓词时,它返回的布尔值只有true或false,你应该写成:
&lt; xsl:value-of select =“root1 / root2 / test / @ attr1”/&gt;