XSLT是否有任何数组概念?

Mic*_*ker 0 arrays xslt xslt-1.0

我以前从未真正使用过XSLT,我正在寻找一些建议.

我从GSA框中以XML格式返回以下项目:

<MT N="searchCategories" V="Category 1"/>
<MT N="searchCategories" V="Category 2"/>
etc etc
Run Code Online (Sandbox Code Playgroud)

可以有任何数量的这些类别.

我只是想知道XSLT是否有任何数组概念?

如果是这样:

  • 我怎么能将上面的所有节点枚举成一个数组?
  • 我怎样才能获得数组的长度?

如果不:

  • 有没有可用的工作?

我相信我使用的是XSLT 1.0版

Dim*_*hev 5

正如@Michael Kay所解释的那样,对于XPath 1.0和XPath 2.0,XPath数据模型(XDM)都不支持数组数据结构.

但是,可以像这样使用类似数组的语法:

在XPath 1.0/2.0中,可以定义一个变量来包含一组特定的节点,这些节点可以通过它们的位置(按文档顺序)访问,在谓词中指定这个位置.

这是一个例子:

<xsl:variable name="vTransfers" select="/*/transfer"/>
Run Code Online (Sandbox Code Playgroud)

定义一个名为vTransfersvalue的变量,该变量是所有transfer元素的节点集,每个元素都是XML文档顶部元素的子元素.

然后:

$vTransfers[1]
Run Code Online (Sandbox Code Playgroud)

选择包含的第一个元素$vTransfers.

$vTransfers[2]
Run Code Online (Sandbox Code Playgroud)

选择包含在的第二个元素$vTransfers,...

$vTransfers[position() = $k]
Run Code Online (Sandbox Code Playgroud)

选择节点,$vTransfers其位置按文档顺序等于变量中包含的值$k.

此外,XPath 2.0支持 序列的概念.序列就像一个项目列表.项目可以是任何类型 - 不仅是节点.序列中的项目按照它们在序列中出现(定义)的方式排序.如果序列中的两个项目是节点,则它们的顺序仍然是序列中定义的顺序,这可能与它们的文档顺序不同.

示例:

<xsl:variable name="vNumList" as="xs:integer*" select="3, 5, 7"/>
Run Code Online (Sandbox Code Playgroud)

然后在这样引用时:

$vNumlist[2]
Run Code Online (Sandbox Code Playgroud)

生产:

5
Run Code Online (Sandbox Code Playgroud)

请记住:虽然这些合成构造类似于从数组中选择项目,但节点集和序列不是数组.特别是,它们通常缺少阵列对其元素的快速访问O(1).在节点集和序列的情况下,在随机位置访问项目的效率通常是O(N).这意味着当使用具有节点集或序列的类似数组的符号时,在使用数组时为O(N)的算法可以是O(N ^ 2).