序列是如何拼接的,为啥我的变量值是文档节点?
Posted
技术标签:
【中文标题】序列是如何拼接的,为啥我的变量值是文档节点?【英文标题】:How are sequences spliced, and why is my variable's value a document node?序列是如何拼接的,为什么我的变量值是文档节点? 【发布时间】:2020-04-17 05:33:17 【问题描述】:看下面的代码:
<?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
被视为“文档节点”类型?
单词“看起来您的帖子主要是代码;请添加更多详细信息。”总是阻止我提交。
【问题讨论】:
【参考方案1】:嗯,你有不同的变量声明,一个使用as
属性,另一个不使用。
您似乎已经推断出您的第一个没有任何as
声明的案例会导致文档节点(包含内容)。
至于各种选项的血腥细节,规范处理了https://www.w3.org/TR/xslt-30/#temporary-trees 中的第一个案例,并概述了as
、select
和xsl:variable
中的内容构造函数在https://www.w3.org/TR/xslt-30/#variable-values 中如何交互的各种选项。
【讨论】:
没有任何as
声明的变量是否总是被视为文档节点类型,无论其值是多少?
你可以使用我链接的资料吗?它在第一句中说“在评估具有非空内容 和且没有 as 属性的 xsl:variable、xsl:param 或 xsl:with-param 元素时,会隐式创建文档节点”。所以<xsl:variable name="foo" select="1"/>
不会创建一个文档节点,它只是给变量xs:integer
值1
,但是<xsl:variable name="foo">1</xsl:variable>
创建一个文档节点,其中包含一个带有字符串值1
的文本节点。
其实我没有在链接中找到答案,你的回复很准确。谢谢。
@cmf41013 - 请考虑accepting this answer。另请参阅***.com/help/someone-answers 了解更多信息。
@cmf41013,从这次经验中吸取的教训是学习尽可能频繁地使用<xsl:variable>
的select
属性(当然,还要指定变量的类型!) .只有当不可能遵守这一规则时,才应该在变量的序列构造函数(主体)中定义值。通常,当我们希望在变量中捕获处理 XSLT 指令的结果时(例如 <xsl:apply-templates>
以上是关于序列是如何拼接的,为啥我的变量值是文档节点?的主要内容,如果未能解决你的问题,请参考以下文章