XSLT,逐个处理元素

时间:2010-06-01 10:58:21

标签: xslt

我在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"
}

3 个答案:

答案 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() &gt; 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() &gt; 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>