我以前从未真正使用过XSLT,正在寻找一些建议。
我从 GSA 框中以 XML 格式返回了以下项目:
<MT N="searchCategories" V="Category 1"/>
<MT N="searchCategories" V="Category 2"/>
etc etc
这些类别可以有任何数量。
我只是想知道 XSLT 是否有数组的概念?
㞖:
- 如何将上面的所有节点枚举到一个数组中?
- 如何获取数组的长度?
如果没有:
- 有什么解决方法吗?
我相信我正在使用 XSLT 版本 1.0
正如 @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(。
XSLT 2.0 支持序列,这些序列在许多方面与数组相似。序列可以包含节点或原子值(原子值的示例包括字符串、数字、日期等(。XSLT 1.0 中的数据结构受到更多限制;您基本上仅限于将事物建模为 XML 树。
但是,您问错了问题。鉴于您对语言的有限经验,最好描述您希望程序为给定输入生成的输出,并就如何进行转换寻求建议。
XPath 3.1 和 XSLT 3.0 引入了数组作为新的数据类型 https://www.w3.org/TR/xslt-30/#arrays: