我之前从未真正使用过XSLT,并且正在寻找一些建议。
我从GSA框中以XML格式返回以下项目:
<MT N="searchCategories" V="Category 1"/>
<MT N="searchCategories" V="Category 2"/>
etc etc
可以有任何数量的这些类别。
我只是想知道XSLT是否有任何数组概念?
如果是这样的话:
如果不是:
我相信我使用的是XSLT 1.0版
答案 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