XSLT xsl :sequence. 它有什么用..?

标签 xslt xslt-1.0 xslt-2.0

我知道下面的问题有点初学者,但我需要你的帮助来理解一个基本概念。

我想首先说,我是 3 年的 XSLT 程序员,但我在这里学到了一些我从未知道的新的和非常基础的东西(在我的工作中,任何人都独自学习如何编程,没有类(class)涉及)。

我的问题是:xsl:sequence的用途是什么? ?

我一直在用xsl:copy-of为了按原样复制节点,xsl:apply-templates为了修改我选择的节点和value-of对于简单的文本。

我从来没有必要使用 xsl:sequence .如果有人可以向我展示 xsl:sequence 的示例,我将不胜感激如果没有我上面提到的那些,则首选或无法实现的用法。

还有一件事,我已经阅读了 xsl:sequence定义当然,但我无法推断它是如何有用的。

最佳答案

<xsl:sequence>在原子值(或原子值序列)上与 <xsl:copy-of> 相同两者都只返回其输入的副本。当您考虑节点时,差异就会出现。

如果 $n 是单个元素节点,例如由类似的定义

<xsl:variable name="n" select="/html"/>

然后
<xsl:copy-of select="$n"/>

返回节点的副本,它具有相同的名称和子结构,但它是一个具有新标识的新节点(并且没有父节点)。
<xsl:sequence select="$n"/>

返回节点 $n,返回的节点与 $n 具有相同的父节点,并且通过 is 等于它Xpath 运算符。

这种差异在传统(XSLT 1 样式)模板用法中几乎完全被掩盖了,因为您永远无法访问任一操作的结果,构造函数的结果被隐式复制到输出树中,因此事实 xsl:sequence不会使副本被屏蔽。
<xsl:template match="a">
   <x>
   <xsl:sequence select="$n"/>
   </x>
</xsl:template>

是相同的
<xsl:template match="a">
    <x>
    <xsl:copy-of select="$n"/>
    </x>
</xsl:template>

两者都创建一个新的元素节点并将内容的结果复制为新节点 x 的子节点.

但是,如果您使用函数,很快就会看到差异。
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:f="data:,f">

    <xsl:variable name="s">
        <x>hello</x>
    </xsl:variable>

    <xsl:template name="main">
        ::
        :: <xsl:value-of select="$s/x is f:s($s/x)"/>
        :: <xsl:value-of select="$s/x is f:c($s/x)"/>
        ::
        :: <xsl:value-of select="count(f:s($s/x)/..)"/>
        :: <xsl:value-of select="count(f:c($s/x)/..)"/>
        ::
    </xsl:template>

    <xsl:function name="f:s">
        <xsl:param name="x"/>
        <xsl:sequence select="$x"/>
    </xsl:function>

    <xsl:function name="f:c">
        <xsl:param name="x"/>
        <xsl:copy-of select="$x"/>
    </xsl:function>

</xsl:stylesheet>

生产
$ saxon9 -it main seq.xsl
<?xml version="1.0" encoding="UTF-8"?>
::
:: true
:: false
::
:: 1
:: 0
::

这里是xsl:sequence的结果和 xsl:copy-of完全不同。

关于XSLT xsl :sequence. 它有什么用..?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14361629/

相关文章:

xml - XSLT:如果值存在,添加逗号

javascript - 不区分大小写的 XPath contains() 可能吗?

xml - XSL 转换后 LaTeX 表不适合线宽

javascript - 使用 Javascript 作为 XSLT 转换的一部分时如何传递参数

xml - XSL XSL :template match ="/"

html - 构建网站并显示使用 XSLT 转换的 XML 文档

xml - 使用嵌套在另一个键中的键时输出唯一的 XSLT 属性值

xml - 如何更新xslt中的变量值?

java - xslt 函数 format-dateTime 在转换为 PDF 时不起作用

java - 将美国日期转换为日本日期