在xslt中创建数组

时间:2010-07-21 13:50:17

标签: xml xslt

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

5 个答案:

答案 0 :(得分: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数据类型。结果树片段数据类型不允许节点集运算符。因此,唯一的方法是使用扩展函数:在这种情况下,来自EXSLT的node-set()(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>

结果,任何输入:

B

只有你愿意,我才能为你提供一个XSLT 1.0 plus扩展示例(这不是标准......)

答案 1 :(得分:8)

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

(1 to 10)[3]

评估为3

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

评估为'a'

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

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

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

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

    < / LI>

答案 2 :(得分:5)

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

答案 3 :(得分:0)

使用XSLT 2.0,您可以轻松使用

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    exclude-result-prefixes="xs"
    version="2.0">
    <xsl:output omit-xml-declaration="yes"/>
    <xsl:template match="/">
    <xsl:variable name="array" select="('A','B','C')"/> 
        <xsl:value-of select="$array[2]"/>
    </xsl:template>
</xsl:stylesheet>

答案 4 :(得分:0)

如果需要过滤器和foreach。 (csv示例)

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt" version="2.0">
   <xsl:output method="text" omit-xml-declaration="yes" />
   <xsl:variable name="array" as="element()*">
      <column name="Company" enable="true">Company</column>
      <column name="User" enable="true">User</column>
   </xsl:variable>
   <xsl:variable name="separator">
      <xsl:text>;</xsl:text>
   </xsl:variable>
   <xsl:variable name="newline">
      <xsl:text>&#xa;</xsl:text>
   </xsl:variable>
   <!-- Output the CSV header -->
   <xsl:for-each select="msxsl:node-set($array)/column[@enable = 'true']">
      <xsl:value-of select="." />
      <xsl:if test="position() != last()">
         <xsl:value-of select="$separator" />
      </xsl:if>
   </xsl:for-each>
   <xsl:value-of select="$newline" />

<!-- your code inserted row -->

</xsl:stylesheet>

Read more