我想知道我们是否在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>
答案 0 :(得分:4)
澄清一个序列的实例,与XPath / XSLT中的任何其他内容一样是不可变的,答案是肯定的:
迭代序列:
<xsl:for-each select="$seq">
<!-- Whatever necessary code here -->
<!-- . is the current item of the sequence-->
</xsl:for-each>
Add an item to a sequence(生成一个新序列,这是此操作的结果):
insert-before($target as item()*,
$position as xs:integer,
$inserts as item()*) as item()*
摘要:返回根据$ 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