【发布时间】: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 不再与此问题相关。
-
当然可以
<xsl:for-each select="@*">并使用<xsl:value-of select="name()" />和<xsl:value-of select="." />。这是你的葬礼,你被警告了。