2011-04-27 81 views
0

我想知道我们是否有XSL 2.0中的某些东西,相当于Java中的List。我想递归地调用一个模板10次,并传入一个名为'mylist'的输入变量。在模板中,我想要做的操作,如添加项目列表,从列表中删除项目,迭代列表中的项目等。我可以看到像'序列'的东西,但我不知道它是否可以用来添加,删除,迭代等。请分享你的想法来实现这一点。XSL - 列表等效实现

我尝试使用序列的帮助下面的响应,我面临一些语法问题,如声明一个空序列。我想要使​​用insert-before或concat sequnce函数来打印序列1 2 3 4 5 6 7 8 9 10。请帮我修复语法。

<xsl:stylesheet version="2.0" 
    xmlns:locator="http://ntr.lxnx.org" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:template match="/"> 
    <xsl:variable name="output"> 
    <xsl:call-template name="calculate-data"> 
       <xsl:with-param 
        name="sequence" 
        select=""/> 
       <xsl:with-param 
        name="count" 
        select="1"/> 
      </xsl:call-template> 
    </xsl:variable> 
    <xsl:value-of select="output"></xsl:value-of> 
    </xsl:template> 
    <xsl:variable name="main-root" as="document-node()" select="/"/> 

    <xsl:template name="calculate-data"> 
<xsl:param name="sequence"/> 
    <xsl:param name="count" select="0"/> 
<xsl:if test="$count != 10"> 
       fn:insert-before($count as item()*,0 as xs:integer,$sequence as item()*) 
       <xsl:call-template name="calculate-data"> 
        <xsl:with-param 
         name="sequence" 
         select="$sequence"/> 
        <xsl:with-param 
         name="count" 
         select="$count + 1"/> 
       </xsl:call-template>    


</xsl:if> 
     </xsl:template> 
     </xsl:stylesheet> 
+0

您可以迭代序列。您将能够将模板应用于XSLT 3.0中的序列.-关于添加/删除:注意XSLT是一种声明性语言,这些函数将生成一个新实例。 – 2011-04-27 20:49:36

+0

Rachel,也许你可以提供一个你想要的输入/输出类型的小例子?我问的原因是XSL通常不被用作过程语言,所以在迭代时更改列表中的值通常不是解决问题的理想方法。相反,你会指定你想要的最终结果是什么,而不是如何得到结果。 – Erica 2011-04-28 01:32:25

+0

@Erica:你的观点非常真实。我有兴趣使用序列来实现解决方案,因为我想了解更多信息。感谢您的答复。 – Rachel 2011-04-29 01:28:51

回答

4

随着澄清顺序的一个实例,如在的XPath/XSLT别的是不可改变的,答案是肯定的

  1. 遍历序列

    <xsl:for-each select="$seq"> 
    <!-- Whatever necessary code here --> 
    <!-- . is the current item of the sequence--> 
    </xsl:for-each> 
    
  2. Add an item to a sequence(产生一个新的序列,即此操作的结果):

    insert-before($target as item()*, 
           $position as xs:integer, 
           $inserts as item()*) as item()* 
    

摘要:返回从$ a的值构造一个新的序列定位 与 插入由值指定的位置$插入的值 $ position。 ($目标的值是 不受序列 结构。)

. 3. Concatenation of two sequences(产生一个新的序列,它是此操作的结果):

$seq1 , $seq2 

.。 4。 Remove an item from a sequence

 remove($target as item()*, $position as xs:integer) as item()* 

摘要:返回从$ a的值构造一个新的序列,在通过除去$位置 值指定的位置 与项定位

. 0.5。 Extract a subsequence from a sequence

subsequence($sourceSeq as item()*, 
       $startingLoc as xs:double, 
       $length as xs:double) **as item**()* 

摘要:返回 $ sourceSeq的贵重物品在由$ startingLoc 的值指示的位置 开始,一直持续的项目 数表示的连续序列由$ length的值。

而且有很多比较有用standard XPath 2.0 functions over sequences

注意:XPath 2.0序列没有的唯一功能是“嵌套”。一个序列总是“平坦的”,而一个序列的一个项目本身不能是一个序列。有多种方法来模拟多级序列 - 例如,一个项目可以是一个节点,它的子节点可以被看作是一个嵌套序列。

更新:这里是如何将这些功能可以方便地用于解决OP的更新问题:

<xsl:stylesheet version="2.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:xs="http://www.w3.org/2001/XMLSchema" 
xmlns:my="my:my" > 

<xsl:template match="/"> 
    <xsl:sequence select="my:populateSequence((), 1, 10)"/> 
</xsl:template> 

<xsl:function name="my:populateSequence" as="xs:integer*"> 
    <xsl:param name="pSeq" as="xs:integer*"/> 
    <xsl:param name="pStart" as="xs:integer"/> 
    <xsl:param name="pEnd" as="xs:integer"/> 

    <xsl:sequence select= 
    "if($pStart gt $pEnd) 
     then $pSeq 
     else my:populateSequence(($pSeq, $pStart), $pStart+1, $pEnd) 
    "/> 
</xsl:function> 
</xsl:stylesheet> 

当这个XSLT 2.0变换的任何XML文档(未使用)应用,通缉结果产生

1 2 3 4 5 6 7 8 9 10 
+0

谢谢。它有助于 !! – Rachel 2011-04-28 14:57:41

+0

@Rachel:不客气。 – 2011-04-28 15:06:43

+0

我很欣赏你的想法分享。我面临着实现这个的语法问题。我已经用xsl更新了我的帖子。请提供您的意见以声明序列中的空序列和插入项目。谢谢。 – Rachel 2011-04-28 23:18:17