XSLT是否有任何数组概念?

时间:2011-12-14 10:40:11

标签: arrays xslt xslt-1.0

我之前从未真正使用过XSLT,并且正在寻找一些建议。

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

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

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

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

如果是这样的话:

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

如果不是:

  • 有没有可用的工作?

我相信我使用的是XSLT 1.0版

3 个答案:

答案 0 :(得分: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

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

答案 1 :(得分:3)

XSLT 2.0支持序列,它们在很多方面与数组类似。序列可以包含节点或原子值(原子值的示例是字符串,数字,日期等)。 XSLT 1.0中的数据结构更加有限;你基本上只限于将事物建模为XML树。

但是,你问的是错误的问题。鉴于您对该语言的经验有限,最好描述您希望程序为给定输入生成的输出,并询问有关如何进行转换的建议。

答案 2 :(得分:0)

XPath 3.1和XSLT 3.0引入了数组作为新数据类型:https://www.w3.org/TR/xslt-30/#arrays