考虑以下XSLT 2.0模板
<xsl:template match="/">
<xsl:variable name="var1">
<elem>1</elem>
<elem>2</elem>
<elem>3</elem>
</xsl:variable>
<xsl:text>var1 has </xsl:text>
<xsl:value-of select="count($var1)"/>
<xsl:text>elements.
</xsl:text>
<xsl:variable name="var2" select="$var1/elem[position() > 1]"/>
<xsl:text>var2 has </xsl:text>
<xsl:value-of select="count($var2)"/>
<xsl:text>elements.
</xsl:text>
</xsl:template>
此模板的输出是
var1 has 1 elements
var2 has 2 elements
第一行输出1(而不是,正如我首先预期的那样3),因为var1
是一个文档片段,其中包含<elem>
元素作为childen。现在我的问题:
如何创建不包含文档片段的变量?我可以像使用var2
那样创建它,只留下谓词。但也许有一种方法没有使用第二个变量。或者,作为替代方案:如何在过滤掉某些元素的同时将文档片段保留在变量中?
背景信息:我将在递归函数中使用变量内容,该函数检查var1
中的第一个元素是否符合某些条件。如果满足条件或元素列表为空,则返回值。否则,它将调用自身,并移除var1
的第一个元素(就像我在var2
中所做的那样)。使用var1
作为包含文档片段的参数时,模板中的XPath表达式将不匹配。
答案 0 :(得分:1)
如何创建一个可变的变量 不包含文档片段?
使用:强>
<xsl:variable name="var1" as="element()*">
<elem>1</elem>
<elem>2</elem>
<elem>3</elem>
</xsl:variable>
如何保存文档 过滤时变量中的片段 一些元素?
如果您有:
<xsl:variable name="var1">
<elem>1</elem>
<elem>2</elem>
<elem>3</elem>
</xsl:variable>
使用:强>
<xsl:variable name="var2">
<xsl:copy-of select="$var1/*[. mod 2 = 1]"/>
</xsl:variable>