【问题标题】:Transform XML attributes into name value pairs using XSLT使用 XSLT 将 XML 属性转换为名称值对
【发布时间】:2014-12-21 01:58:50
【问题描述】:

我正在使用 XSLT 来转换 XML。

我目前正在硬编码每个属性名称,如下所示:

    <xsl:for-each select="variable">
    {
         "name" : "<xsl:value-of select="@name" />",
         "value" : "<xsl:value-of select="@value" />"
    }
    </xsl:for-each>

但这看起来真的很乱。有没有办法从属性动态创建键值对,而不必单独硬编码每个属性名称?即上面我已经指定:

"name" : "<xsl:value-of select="@name" />"

有没有办法改变它,所以我只是在循环中使用一些变量,所以它就像:

(pseudocode:)

        <for each attribute in my element>
        {
             "attribute.name" : "attribute.value",
        }
        </xsl:for-each>

编辑:编辑了问题,因此 JSON 与我想要做的事情无关。只是尝试如上所述转换名称值对,而不进行硬编码。

【问题讨论】:

  • XSLT 无法输出 JSON。 JSON 有相当复杂的规则,XSLT 对此一无所知。您以这种方式编写的任何 XSLT 代码在某些时候产生无效的 JSON,并且明智的做法是永远不要将其投入生产。使用适当的工具,其中包含 JSON 序列化程序。
  • XSLT 将 XML 文档转换为您想要转换的任何内容。我确信 JSON 有复杂的规则,但我想做的就像上面的代码一样简单。为了解决我的问题,JSON 并不重要,因为我要做的只是编写 XSLT,这样我就可以动态提取属性名称并使用它,而不是硬编码
  • 那是你误会的地方。 XSLT 可以将 XML 转换成三样东西。 XML、HTML 和纯文本。 JSON 不是有效的输出目标。 (JSON 不是纯文本,就像 HTML 不是纯文本一样。) JSON 是一个 序列化数据结构,就像 XML,你不能使用 XSLT 来生成它,句号。您可以使用 XSLT 生成类似于 JSON 的内容,并且希望可以在接收端进行解析。但你不能确定。这就是为什么你真的应该为你的工作使用合适的工具。有很多。当周围有锤子时,不要用鞋钉钉子。
  • 目前我的代码适合我,并且符合我的要求。感谢您的关注,并且会小心我如何使用我的代码。但是现在,我要做的只是从我的 XSLT 转换中删除我的硬编码。 JSON 不再与此问题相关。
  • 当然可以&lt;xsl:for-each select="@*"&gt; 并使用&lt;xsl:value-of select="name()" /&gt;&lt;xsl:value-of select="." /&gt;。这是你的葬礼,你被警告了。

标签: xml xslt


【解决方案1】:

假设您的代码 sn-p 的上下文是一个模板,它与具有所述属性的元素匹配。 @Tomalak 已经提到了它的要点:

<xsl:for-each select="@*">
  <xsl:text>{&#10;"</xsl:text>
  <xsl:value-of select="name()"/>
  <xsl:text>" : "</xsl:text>
  <xsl:value-of select="."/>
  <xsl:text>",&#10;}</xsl:text>
</xsl:for-each>

(未测试,因为您没有显示完整的样式表。)

始终通过将文本内容放入 xsl:text 元素来控制空白序列化。如前所述,如果您对检索属性名称和值对的一般概念感兴趣,这很好 - 但如果您想输出实际的 JSON,则不一定。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-13
    • 2018-09-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多