XSL - 列出等效实现

时间:2011-04-27 20:17:36

标签: xslt xslt-2.0

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

我尝试在下面的响应的帮助下使用序列,我面临一些语法问题,比如声明一个空序列。我想使用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>

1 个答案:

答案 0 :(得分: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()*
    
  3.   

    摘要:返回根据$ target的值构造的新序列   插入$ insert的值   由值指定的位置   $位置。 ($ target的值是   不受序列的影响   结构。)

    . 3。 Concatenation of two sequences(生成一个由此操作产生的新序列):

       $seq1 , $seq2
    

    .。4。 Remove an item from a sequence

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

    摘要:返回根据$ target的值构造的新序列   在该位置的项目   由$ position的值指定   除去

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

    当对任何XML文档(未使用)应用此XSLT 2.0转换时,生成所需结果

    1 2 3 4 5 6 7 8 9 10