2010-07-21 81 views
24

可以在xslt中创建和使用数组吗?如果是的话,是否有适合在线学习的例子?如果没有,有没有一种方式来存储模拟数组的方式?在xslt中创建数组

+0

好问题(+1)。请参阅我的答案,以获取与XPath(和XSLT)数据类型最接近的详细描述。 – 2010-07-21 16:16:47

回答

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> 

与任一输入,输出:

B 

在XSLT 1.0有不Temporaly结果树数据类型。有一个Result Tree Fragment数据类型不允许节点集操作符。所以,唯一的办法是使用扩展功能:在这种情况下,来自EXSLT的node-set()(MSXSL也有一个内置的node-set()扩展)。

因此,在没有扩展的XSLT 1.0中,您可以只有内联数据模型,或者通过参数或外部文档。作为例子:

<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> 

结果,任何输入:

B 

只有当你想要,我可以为您提供一个XSLT 1.0加扩展例子(这不是STANDAR ...)

+1

@Alejandro - 从我所看到的,你只是简单地使用_name_'array',它是元素节点的集合。 – Oded 2010-07-21 14:19:40

+2

@Oded:没错!这就是**数据建模**的概念。数组数据类型的主要特征是随机访问。这个模型涵盖了这个展示。 – 2010-07-21 14:32:33

+0

@Alejandro - 命名一个数组并不能使它成为一个数组。 xsl中最接近的一个是节点集。 – Oded 2010-07-21 15:01:18

5

不,不是这样。最接近的概念是节点集,它是节点的集合。只要选择的结果是多个节点,就会得到一个节点集。可以使用索引符号(从1开始)访问它们,因此节点集的第一个元素可以使用符号(如selectedNodes[1])进行访问。

+0

我认为这不完全正确。检查我的答案。 – 2010-07-21 14:14:31

6

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

(1 to 10)[3] 

计算结果为3

('a', 'b', 'a', 'c')[3] 

评估为'a'

的序列的项可以是允许在XPath中任何可想到的类型,具有序列自身的异常 - 嵌套序列是不允许的。

请注意:序列是不一样的阵列:

  1. 序列是不可改变的。序列上的任何更新操作(追加或预先添加项目,插入项目或移除项目)都会生成新的序列。

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

+0

+1好答案!后来我意识到我忘记了序列数据类型。我错过了捍卫数据建模的想法。 – 2010-07-21 18:50:59

+0

@Alejandro:什么是“数据建模”? :) – 2010-07-21 19:39:22

+0

对不起,我的英语。我应该说抽象数据类型。 – 2010-07-21 20:04:57