2010-07-21 88 views
24

可以在xslt中創建和使用數組嗎?如果是的話,是否有適合在線學習的例子?如果沒有,有沒有一種方式來存儲模擬數組的方式?在xslt中創建數組

+0

好問題(+1)。請參閱我的答案,以獲取與XPath(和XSLT)數據類型最接近的詳細描述。 – 2010-07-21 16:16:47

回答

23

使用XSLT 2.0,您可以建模任何您想要的數據類型。

作爲例子:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="text" omit-xml-declaration="yes"/> 
    <xsl:variable name="array" as="element()*"> 
     <Item>A</Item> 
     <Item>B</Item> 
     <Item>C</Item> 
    </xsl:variable> 
    <xsl:template match="/"> 
     <xsl:value-of select="$array[2]"/> 
    </xsl:template> 
</xsl:stylesheet> 

與任一輸入,輸出:

B 

在XSLT 1.0有不Temporaly結果樹數據類型。有一個Result Tree Fragment數據類型不允許節點集操作符。所以,唯一的辦法是使用擴展功能:在這種情況下,來自EXSLT的node-set()(MSXSL也有一個內置的node-set()擴展)。

因此,在沒有擴展的XSLT 1.0中,您可以只有內聯數據模型,或者通過參數或外部文檔。作爲例子:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="text" omit-xml-declaration="yes"/> 
    <xsl:variable name="inline-array"> 
     <Item>A</Item> 
     <Item>B</Item> 
     <Item>C</Item> 
    </xsl:variable> 
    <xsl:param name="array" select="document('')/*/xsl:variable[@name='inline-array']/*"/> 
    <xsl:template match="/"> 
     <xsl:value-of select="$array[2]"/> 
    </xsl:template> 
</xsl:stylesheet> 

結果,任何輸入:

B 

只有當你想要,我可以爲您提供一個XSLT 1.0加擴展例子(這不是STANDAR ...)

+1

@Alejandro - 從我所看到的,你只是簡單地使用_name_'array',它是元素節點的集合。 – Oded 2010-07-21 14:19:40

+2

@Oded:沒錯!這就是**數據建模**的概念。數組數據類型的主要特徵是隨機訪問。這個模型涵蓋了這個展示。 – 2010-07-21 14:32:33

+0

@Alejandro - 命名一個數組並不能使它成爲一個數組。 xsl中最接近的一個是節點集。 – Oded 2010-07-21 15:01:18

5

不,不是這樣。最接近的概念是節點集,它是節點的集合。只要選擇的結果是多個節點,就會得到一個節點集。可以使用索引符號(從1開始)訪問它們,因此節點集的第一個元素可以使用符號(如selectedNodes[1])進行訪問。

+0

我認爲這不完全正確。檢查我的答案。 – 2010-07-21 14:14:31

6

中的XPath 2.0序列(在XSLT 2+可用)是最接近陣列

(1 to 10)[3] 

計算結果爲3

('a', 'b', 'a', 'c')[3] 

評估爲'a'

的序列的項可以是允許在XPath中任何可想到的類型,具有序列自身的異常 - 嵌套序列是不允許的。

請注意:序列是不一樣的陣列:

  1. 序列是不可改變的。序列上的任何更新操作(追加或預先添加項目,插入項目或移除項目)都會生成新的序列。

  2. 對於第n項的訪問時間不能保證爲O(1),因爲這是針對數組的,可能是O(n)。

+0

+1好答案!後來我意識到我忘記了序列數據類型。我錯過了捍衛數據建模的想法。 – 2010-07-21 18:50:59

+0

@Alejandro:什麼是「數據建模」? :) – 2010-07-21 19:39:22

+0

對不起,我的英語。我應該說抽象數據類型。 – 2010-07-21 20:04:57