在xslt中创建数组

gar*_* G4 25 xml xslt

可以在xslt中创建和使用数组吗?如果有,在线学习合适的例子?如果没有,有没有办法以模仿数组的方式存储值?

小智 23

使用XSLT 2.0,您可以为任何数据类型建模.

例如:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="text" omit-xml-declaration="yes"/>
    <xsl:variable name="array" as="element()*">
        <Item>A</Item>
        <Item>B</Item>
        <Item>C</Item>
    </xsl:variable>
    <xsl:template match="/">
        <xsl:value-of select="$array[2]"/>
    </xsl:template>
</xsl:stylesheet>
Run Code Online (Sandbox Code Playgroud)

任何输入,输出:

B
Run Code Online (Sandbox Code Playgroud)

在XSLT 1.0中,没有Temporaly Result Tree数据类型.结果树片段数据类型不允许节点集运算符.因此,唯一的方法是使用扩展函数:在这种情况下node-set()来自EXSLT(MSXSL也有内置node-set()扩展).

因此,在没有扩展的XSLT 1.0中,您只能使用内联数据模型,或者使用params或外部文档.例如:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="text" omit-xml-declaration="yes"/>
    <xsl:variable name="inline-array">
        <Item>A</Item>
        <Item>B</Item>
        <Item>C</Item>
    </xsl:variable>
    <xsl:param name="array" select="document('')/*/xsl:variable[@name='inline-array']/*"/>
    <xsl:template match="/">
        <xsl:value-of select="$array[2]"/>
    </xsl:template>
</xsl:stylesheet>
Run Code Online (Sandbox Code Playgroud)

结果,任何输入:

B
Run Code Online (Sandbox Code Playgroud)

只有你想,我可以为你提供一个XSLT 1.0 plus扩展示例(它不是标准...)

  • @Oded:没错!这就是**数据建模的概念**.数组数据类型的主要特征是随机访问.这个模型涵盖了展示. (2认同)

Dim*_*hev 8

XPath 2.0序列(在XSLT 2+中可用)是最接近数组的:

(1 to 10)[3]
Run Code Online (Sandbox Code Playgroud)

评估为 3

('a', 'b', 'a', 'c')[3]
Run Code Online (Sandbox Code Playgroud)

评估为 'a'

序列的项目可以是XPath中允许的任何可想到的类型,但序列本身除外 - 不允许嵌套序列.

请注意:序列与数组不同:

  1. 序列是不可变的.对序列的任何更新操作(附加或前置项目,插入项目或删除项目)都会产生新序列.

  2. 对第n项的访问时间不保证为O(1),因为这是针对数组的,并且可以是O(n).


Ode*_*ded 5

不,不是这样的.最接近的概念是节点集,它是节点的集合.只要select的结果是多个节点,就会得到一个节点集.这些可以使用索引表示法(从1开始)访问,因此可以使用诸如表示法来访问节点集的第一个元素selectedNodes[1].