2013-08-18 29 views
0

在此先感謝您的支持。我只是遇到了一個問題,並在各方面嘗試了很多。在XSLT 1.0中解析和存儲數組中的值

我有一個XSLT 1.0需要用逗號分析xml標籤的值並將其存儲在數組中。

< OPTIONS> VAL1,VAL2,VAL3 ,,, VAL4 </OPTIONS>

在這裏,我需要解析由逗號options字段的值,然後將其存儲在數組中。在這裏,我堅持將它存儲在數組中以供進一步使用的方式。

請指點

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    version="1.0"> 
    <xsl:output method="text" omit-xml-declaration="yes"/> 
    <xsl:variable name="inline-array"> 
     <!--<Item>A</Item> 
     <Item>B</Item> 
     <Item>C</Item>--> 

     <xsl:call-template name="splitByComma"> 
      <xsl:with-param name="str" select="OPTIONS"/> 
     </xsl:call-template> 
    </xsl:variable> 

    <xsl:template match="/"> 
     <xsl:param name="array" select="document('')/*/xsl:variable[@name='inline-array']/*"/> 
     <xsl:value-of select="$array[1]"/>   
    </xsl:template> 

    <xsl:template name="splitByComma"> 
     <xsl:param name="str"/> 
     <xsl:choose> 
      <xsl:when test="contains($str,',')"> 
       <item><xsl:value-of select="substring-before($str,',')"/></item> 
       <xsl:call-template name="splitByComma"> 
        <xsl:with-param name="str" 
         select="substring-after($str,',')"/> 
       </xsl:call-template> 
      </xsl:when> 
      <xsl:otherwise> 
       <item><xsl:value-of select="$str"/></item> 
      </xsl:otherwise> 
     </xsl:choose> 
    </xsl:template> 
</xsl:stylesheet> 

回答

3

我想是因爲當你試圖從樣式表(即<xsl:param name="array" select="document('')/*/xsl:variable[@name='inline-array']/*"/>)加載可變直列陣列的內容,您實際加載它的定義,這可能不是在XSLT 1.0工作。因此它包含元素<xsl:call-template...與孩子<xsl:with-param...不是評估它的結果。

enter image description here

因此,在這種情況下,你有兩個選擇:

(1)採用像XXX一些擴展功能:如果你的XSLT處理器支持節點集(),它

例如,如果您可以使用MS處理器在樣式表的文檔元素中添加其名稱空間:xmlns:msxsl="urn:schemas-microsoft-com:xslt"

你可以從這個命名空間調用函數node-set()<xsl:variable name="array" select="msxsl:node-set($inline-array)/item" />。這會將你的變量處理成你可以作爲另一個xml訪問的節點集:<xsl:value-of select="$array[3]"/>

其他供應商也可以有這樣的擴展 - 查看你的處理器的文檔。或者看看「exslt」。 (2)你也可以使另一個遞歸的命名模板在你的csv字符串中取得所需值的位置。它只會在指定的位置返回單個值。但對於更大的數據可能會有點貴 - 這取決於您的預期輸入。

(3)切換到XSLT 2.0,其中這些東西更容易

可以使用令牌化()函數在XSLT 2.0

<xsl:variable name="OPTIONS" select="'val1,,val2,val3,,,val4'" /> 
<xsl:variable name="array" select="tokenize($OPTIONS, ',')" /> 
<xsl:value-of select="$array[3]" /> 
+0

@爾卡,該變量是全球應前的定義實際轉變發生。我對嗎 ?從我開始工作的地方有一個例子。請按照這裏的網址http://stackoverflow.com/questions/3299938/creating-arrays-in-xslt – Hari

+0

是的,我讀了這個鏈接,但有一個區別。描述的解決方案加載一個帶有「靜態」內容的變量。它只是讀它。你想閱讀它(它)並**解釋**它(它不 - 如果它確實沒有任何理由調用document()函數)。 因此,除了鏈接上的解決方案,它還讀取「」序列並且什麼也不做,它也會從樣式表中讀取元素序列,並且不會對它們做任何更多操作。 如果變量是全局的或不全是無關緊要的。對於document()函數,您的xslt文件只是一個沒有特殊含義的xml文件。 –

+0

是的,我現在明白了。我仍然在努力尋找解決方案。非常感謝。讓我知道你是否給了一些代碼樣本來解決我的問題。 – Hari