xslt - 序列是如何拼接的,为什么我的变量值是文档节点?
问题描述
看下面的代码:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
exclude-result-prefixes="xs"
version="3.0">
<xsl:output indent="yes"/>
<xsl:template match="/">
<root>
<xsl:variable name="v1">
<xsl:variable name="a1" select="137"/>
<xsl:variable name="a2" select="(1, 3, 'abc')"/>
<xsl:variable name="a3" select="823"/>
<xsl:sequence select="$a1"/>
<xsl:sequence select="$a2"/>
<xsl:sequence select="$a3"/>
</xsl:variable>
<xsl:variable name="v2" as="item()+">
<xsl:variable name="b1" select="137"/>
<xsl:variable name="b2" select="(1, 3)"/>
<xsl:variable name="b3" select="823"/>
<xsl:variable name="b4" select="'abc'"/>
<xsl:sequence select="$b1"/>
<xsl:sequence select="$b2"/>
<xsl:sequence select="$b3"/>
<xsl:sequence select="$b4"/>
</xsl:variable>
<count>
<xsl:text>v1 count is: </xsl:text>
<xsl:value-of select="count($v1)"/>
</count>
<count>
<xsl:text>v2 count is: </xsl:text>
<xsl:value-of select="count($v2)"/>
</count>
<count>
<xsl:text>a2 count is: </xsl:text>
<xsl:value-of select="count((1, 3, 'abc'))"/>
</count>
</root>
</xsl:template>
</xsl:stylesheet>
结果输出为:
<root>
<count>v1 count is: 1</count>
<count>v2 count is: 5</count>
<count>a2 count is: 3</count>
</root>
为什么v2 count
不同于v1 count
? 他们似乎有相同的项目。序列如何拼接?为什么被v1
视为“文档节点”类型?
文字“看起来你的帖子主要是代码;请添加更多细节。” 总是阻止我提交。
解决方案
好吧,你有不同的变量声明,一个使用as
属性,另一个不使用。
而且您似乎已经推断出您的第一个没有任何as
声明的案例会导致文档节点(包含内容)。
至于各种选项的血腥细节,该规范在https://www.w3.org/TR/xslt-30/#temporary-trees中处理了您的第一个案例,并概述了交互中的各种选项as
和select
内容构造函数xsl:variable
在https://www.w3.org/TR/xslt-30/#variable-values。