我在XSLT上很弱,所以这看起来很明显。这是一些示例XML
<term>
<name>cholecystocolonic fistula</name>
<definition>blah blah</definition>
<reference>cholecystocolostomy</reference>
</term>
这是我前一段时间写的XSLT来处理它
<xsl:template name="term">
{
"dictitle": "<xsl:value-of select="name" disable-output-escaping="yes" />",
"html": "<xsl:value-of select="definition" disable-output-escaping="yes"/>",
"reference": "<xsl:value-of select="reference" disable-output-escaping="yes"/>
}
</xsl:template>
基本上我是从XML创建JSON的。
现在需求已经改变,现在XML可以有多个定义标记和引用标记。它们可以以任何顺序出现,即定义,参考,参考,定义,参考。
如何更新XSLT以适应这种情况?可能值得一提的是,因为我的XSLT处理器使用的是.NET,所以我只能使用XSLT 1.0命令。
非常感谢!
编辑 - 澄清
这是我想要创建的JSON,给出以下示例XML
<term>
<name>cholecystocolonic fistula</name>
<definition>blah blah</definition>
<reference>cholecystocolostomy</reference>
<definition>XSLT is not as easy as it should be</definition>
<reference>qui</reference>
</term>
{
dictitle: "cholecystocolonic fistula",
html: "blah blah",
reference: "cholecystocolostomy",
html: "XSLT is not as easy as it should be",
reference: "qui"
}
答案 0 :(得分:3)
JSON属性名称必须是唯一的,因此您不能以您概述的方式拥有多个“引用”属性。
XML没有这个限制;您可以在同一级别拥有多个“引用”节点。
http://metajack.im/2010/02/01/json-versus-xml-not-as-simple-as-you-think/
答案 1 :(得分:-1)
您需要使用for-each
元素。
这将为您提供所有参考元素的数组:
"references": [
<xsl:for-each select="reference">
<xsl:if test="position() > 1">,</xsl:if>
"<xsl:value-of select="." disable-output-escaping="yes" />"
</xsl:for-each>
]
如您所见,我为数组添加了[]并在其中使用了for-each
元素。选择.
的值将返回当前节点的内容。输出将是(粗略地):
"references": ["foo", "bar", "baz"]
如果这个JSON结构不是你想要的,请告诉我。
编辑:
如果要保留订单,则必须稍微改变JSON结构:
"refsAndDefs": [
<xsl:for-each select="reference|definition">
<xsl:if test="position() > 1">,</xsl:if>
"<xsl:value-of select="name()" />": "<xsl:value-of select="." disable-output-escaping="yes" />"
</xsl:for-each>
]
结果将是
的结果"refsAndDefs": [
{"reference": "foo"},
{"definition": "bar"},
{"definition": "baz"},
{"reference": "baa"}
]
等等。
答案 2 :(得分:-1)
魁,
这应该生成你想要的JSON但不幸的是输出是无效的JSON ......
<xsl:template match="/term">
{
<xsl:apply-templates select="*"/>
}
</xsl:template>
<xsl:template match="name">
"dictitle": "<xsl:value-of select="." disable-output-escaping="yes" />",
</xsl:template>
<xsl:template match="definition">
"html": "<xsl:value-of select="." disable-output-escaping="yes"/>",
</xsl:template>
<xsl:template match="reference">
"reference": "<xsl:value-of select="." disable-output-escaping="yes"/>
</xsl:template>