序列是如何拼接的,为啥我的变量值是文档节点?

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 countv1 count 不同?他们似乎有相同的项目。序列如何拼接? 为什么v1 被视为“文档节点”类型?

单词“看起来您的帖子主要是代码;请添加更多详细信息。”总是阻止我提交。

【问题讨论】:

【参考方案1】:

嗯,你有不同的变量声明,一个使用as 属性,另一个不使用。

您似乎已经推断出您的第一个没有任何as 声明的案例会导致文档节点(包含内容)。

至于各种选项的血腥细节,规范处理了https://www.w3.org/TR/xslt-30/#temporary-trees 中的第一个案例,并概述了asselectxsl:variable 中的内容构造函数在https://www.w3.org/TR/xslt-30/#variable-values 中如何交互的各种选项。

【讨论】:

没有任何as 声明的变量是否总是被视为文档节点类型,无论其值是多少? 你可以使用我链接的资料吗?它在第一句中说“在评估具有非空内容 且没有 as 属性的 xsl:variable、xsl:param 或 xsl:with-param 元素时,会隐式创建文档节点”。所以&lt;xsl:variable name="foo" select="1"/&gt; 不会创建一个文档节点,它只是给变量xs:integer1,但是&lt;xsl:variable name="foo"&gt;1&lt;/xsl:variable&gt; 创建一个文档节点,其中包含一个带有字符串值1 的文本节点。 其实我没有在链接中找到答案,你的回复很准确。谢谢。 @cmf41013 - 请考虑accepting this answer。另请参阅***.com/help/someone-answers 了解更多信息。 @cmf41013,从这次经验中吸取的教训是学习尽可能频繁地使用&lt;xsl:variable&gt;select 属性(当然,还要指定变量的类型!) .只有当不可能遵守这一规则时,才应该在变量的序列构造函数(主体)中定义值。通常,当我们希望在变量中捕获处理 XSLT 指令的结果时(例如 &lt;xsl:apply-templates&gt;

以上是关于序列是如何拼接的,为啥我的变量值是文档节点?的主要内容,如果未能解决你的问题,请参考以下文章

Shell脚本:转义序列字符在检索带有转义序列的变量值时如何表现?

如何覆盖红宝石块中的节点属性值/使用红宝石块中的变量值?

检查内联函数内的变量值

如何使用不同的变量值再次调用 graphql 查询?

django 可以修改模板中的变量值吗?

C#如何将新变量的基类中的变量值更改为派生类