使用XSLT处理变量数组

时间:2011-05-18 06:43:55

标签: xslt

我在XSLT中声明了一个变量,如下所示:

    <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:value-of select="$array[1]" />

只要我的内联数组具有静态内容,这就可以正常工作。但我的要求是将XSLT中的值动态分配给标签“Item”,即。类似的东西:

<xsl:variable name="inline-array">
    <Item>$item1</Item>
    <Item>$item2</Item>
    <Item>$item3</Item>
</xsl:variable>

但是,我尝试了所有可能的选择而没有任何运气。任何建议将不胜感激。我们也欢迎任何其他选项来满足我的要求。谢谢。

2 个答案:

答案 0 :(得分:3)

实现此目的的一种方法是使用扩展函数,即 node-set 函数,该函数从结果树片段返回一组节点。

首先,您需要为扩展函数定义名称空间,如此

<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:msxsl="urn:schemas-microsoft-com:xslt">

在这种情况下,我使用的是Microsoft扩展功能,但根据您使用的平台,其他功能可用。 (http://exslt.org/common是非Microsoft平台的另一种常见方法)。

接下来,您可以像这样定义“数组”参数(或您想要的变量)。

<xsl:param name="array" select="msxsl:node-set($inline-array)"/>

最后,您可以像这样访问此数组

<xsl:value-of select="$array/Item[1]"/>

将这个完全放在一个简单的例子中就可以了解这个

<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:msxsl="urn:schemas-microsoft-com:xslt">

   <xsl:output method="text" />

   <xsl:variable name="inline-array">
      <Item>
         <xsl:value-of select="$Item1"/>
      </Item>
      <Item>
         <xsl:value-of select="$Item2"/>
      </Item>
      <Item>
         <xsl:value-of select="$Item3"/>
      </Item>
   </xsl:variable>

   <xsl:param name="Item1">1</xsl:param>
   <xsl:param name="Item2">2</xsl:param>
   <xsl:param name="Item3">3</xsl:param>
   <xsl:param name="array" select="msxsl:node-set($inline-array)"/>

   <xsl:template match="/">
      <xsl:value-of select="$array/Item[1]"/>
   </xsl:template>

</xsl:stylesheet>

运行时,只会输出以下结果:

1

答案 1 :(得分:2)

首先,您是否坚持使用XSLT 1.0?如果只有您可以转移到XSLT 2.0,则很少需要使用文档('')访问样式表源代码等变通方法。

其次,我认为我们需要查看样式表的设计,如果没有您要解决的问题的描述,我们就无法真正做到这一点(与您尝试解决方案的做法不同。)