2010-06-01 21 views
0

我在XSLT方面很弱,所以這可能看起來很明顯。下面是一些示例XMLXSLT,一個接一個的處理元素

<term> 
    <name>cholecystocolonic fistula</name> 
    <definition>blah blah</definition> 
    <reference>cholecystocolostomy</reference> 
    </term> 

這裏是我寫的前一陣子處理它

<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的XSLT。

現在需求已經改變,現在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

JSON屬性名稱必須是唯一的,因此您不能以您所概述的方式擁有多個「引用」屬性。

XML沒有這個限制;您可以在同一級別擁有多個「參考」節點。

http://metajack.im/2010/02/01/json-versus-xml-not-as-simple-as-you-think/

+0

啊,我不知道這一點,這有點煩人:/ – qui 2010-06-01 11:18:10

+0

標記爲答案,因爲它已經引導我遠離這種方法;( – qui 2010-06-01 11:32:31

-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"} 
] 

等等。

+0

對不起,我應該澄清的是,在JSON創建的引用和定義標籤應該出現在相同的順序 – qui 2010-06-01 11:05:58

+0

@qui:請參閱我的更新答案。 – 2010-06-01 11:50:22

+0

downvote的任何原因? – 2010-06-01 14:04:10

-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> 
相關問題