无法使用XSLT从XML获取属性

时间:2016-02-06 12:56:13

标签: json xml xslt

我正在尝试使用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的页眉和页脚已经得到了解决。

3 个答案:

答案 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;