2011-12-14 43 views
0

我從來沒有真正使用過XSLT,並且正在尋找一些建議。XSLT是否有任何數組的概念?

我從GSA框返回的XML以下項目:

<MT N="searchCategories" V="Category 1"/> 
<MT N="searchCategories" V="Category 2"/> 
etc etc 

可以有這些類別的任何量。

我只是想知道XSLT是否有任何數組的概念?

如果是這樣的:

  • 我怎麼能列舉上述的所有節點到一個數組?
  • 我將如何獲得數組的長度?

如果不是:

  • 是否有任何變通可用?

相信我使用XSLT版本1.0

+0

XSLT沒有數組。你有什麼需求? – 2011-12-14 10:42:53

+0

我需要枚舉這些值,並根據特定條件從它們中構建一個麪包屑。 – 2011-12-14 10:47:24

回答

5

正如@Michael Kay所解釋的,XPath 1.0和XPath 2.0都沒有XPath數據模型(XDM)支持的數組數據結構。

然而,也可以使用類似陣列的語法如下:

在XPath 1.0/2.0可以定義一個變量包含特定的一組節點的,並且這些可以通過它們的位置被訪問(按文檔順序),在謂詞中指定此位置。

下面是一個例子

<xsl:variable name="vTransfers" select="/*/transfer"/> 

定義了一個名爲vTransfers與值的所有元素transfer其中的每一個是XML文檔的頂部元素的子的節點集的變量。

然後

$vTransfers[1] 

選擇被包含在$vTransfers第一個元素。

$vTransfers[2] 

選擇被包含在$vTransfers第二元件,...

$vTransfers[position() = $k] 

選擇來自$vTransfers其位置,按文檔順序節點,等於包含在變量$k的值。

此外,XPath 2.0支持序列的概念。一個序列就像一個項目列表。一個項目可以是任何類型 - 不僅是節點。序列中的項目按照它們出現(已定義)的順序進行排序。如果序列中的兩個項目是節點,它們的順序仍然是順序中定義的順序,這可能與它們的文檔順序不同。

<xsl:variable name="vNumList" as="xs:integer*" select="3, 5, 7"/> 

然後當像這樣引用:

$vNumlist[2] 

生產:

5 

記住:雖然這些synthactic構建體類似於SELEC來自陣列的項目,節點集和序列是而不是陣列。特別是,它們通常缺乏數組對其元素的快速訪問O(1)。在節點集和序列的情況下,訪問隨機位置處的項目的效率通常是O(N)。這意味着當使用數組時,O(N)的算法在使用帶有節點集或序列的數組式符號時可能爲O(N^2)。

3

XSLT 2.0支持序列,其是在很多方面相似的陣列。序列可以包含節點或原子值(原子值的例子是字符串,數字,日期等)。 XSLT 1.0中的數據結構更加有限;你基本上只能將事物建模爲XML樹。

但是,你問的是錯誤的問題。鑑於您在語言方面的經驗不足,最好描述一下您希望程序爲某個給定輸入生成的輸出,並就如何執行轉換提出建議。