Xml 如何使用XSLT3.0中的xsl:stream、xsl:acculator、xs:fork?

Xml 如何使用XSLT3.0中的xsl:stream、xsl:acculator、xs:fork?,xml,xslt,xslt-3.0,Xml,Xslt,Xslt 3.0,我正在阅读有关XSLT 3.0的W3C文档。我想知道如何使用这些元素: (1) xsl:decimal-format (2) xsl:stream (3) xsl:accumulator (4) xsl:accumulator-rule (5) xsl:fork 显然,这些是一些使用较少的元素。由于给出的示例有限,这里提供的答案将有助于XSLT的未来学习者。有人能演示一下如何使用它们吗 我知道有很多问题需要回答。因此,我将投票支持任何正确的部分答案,希望它对其他人有用。 这里有一个很好的例子:

我正在阅读有关XSLT 3.0的W3C文档。我想知道如何使用这些元素:

(1) xsl:decimal-format
(2) xsl:stream
(3) xsl:accumulator
(4) xsl:accumulator-rule
(5) xsl:fork
显然,这些是一些使用较少的元素。由于给出的示例有限,这里提供的答案将有助于XSLT的未来学习者。有人能演示一下如何使用它们吗

我知道有很多问题需要回答。因此,我将投票支持任何正确的部分答案,希望它对其他人有用。


这里有一个很好的例子:

示例简化:在XSL中声明

<xsl:decimal-format name="example" decimal-separator="." grouping-separator=","  
 infinity="INFINITY" minus-sign="-" NaN="Not a Number" percent="%"
 per-mille="m" zero-digit="0" digit="#" pattern-separator=";" />

xsl:decimal格式
从1.0版开始就在规范中;您引用的其他元素在版本3.0中是新的,并且都与流相关(即,能够“动态”处理源文档,而无需在内存中加载整个树)


…做点什么。。。
基本上与

<xsl:for-each select="doc('in.xml')">
   ...do something...
</xsl:for-each>

…做点什么。。。
除了“做点什么”是流式的(这意味着它必须符合流化规则)。例如,如果您想了解大量员工的平均工资,您可以这样做

<xsl:stream href="in.xml">
   <result><xsl:value-of select="avg(//employee/@salary)"/></result>
</xsl:stream>

如果要在输入文档的单个流传递过程中计算最低和最高工资,该怎么办?xsl:fork和累加器都提供了这个问题的解决方案。xsl:fork允许您指定在同一过程中发生的两个或多个计算,有效地并行:

<xsl:stream href="in.xml">
   <result>
     <xsl:fork>
        <xsl:sequence>
           <min><xsl:value-of select="min(//employee/@salary)"/></min>
        </xsl:sequence>
        <xsl:sequence>
           <max><xsl:value-of select="max(//employee/@salary)"/></max>
        </xsl:sequence>
     </xsl:fork>
   </result>
</xsl:stream>

xsl:accumulator允许您定义作为读取文档的副作用而有效发生的处理:

<xsl:accumulator name="min-salary" initial-value="10000000">
  <xsl:accumulator-rule match="employee" 
      select="if (@salary lt $value) then @salary else $value"/>
</xsl:accumulator>


然后,您可以在处理过程中的任何时候通过在('min-salary')之前调用
累加器来读取到目前为止的最低工资

奇怪。我不得不将样式表的版本从3.0改为1.0,以使其正常工作。我还想知道它,刚刚用工作示例更新了答案。那么什么时候对累加器进行评估?它与流式处理有何关系?流式处理时,累加器会随着文档的读取而逐步评估:每个开始元素或结束元素事件都会触发任何匹配的累加器规则,这可能会更新该节点的累加器值。累加器也适用于非流式文档,但其设计允许在流式处理时执行计算,否则需要对输入文档进行多次传递(例如,创建后台索引)。
<xsl:stream href="in.xml">
   <result><xsl:value-of select="avg(//employee/@salary)"/></result>
</xsl:stream>
<xsl:stream href="in.xml">
   <result>
     <xsl:fork>
        <xsl:sequence>
           <min><xsl:value-of select="min(//employee/@salary)"/></min>
        </xsl:sequence>
        <xsl:sequence>
           <max><xsl:value-of select="max(//employee/@salary)"/></max>
        </xsl:sequence>
     </xsl:fork>
   </result>
</xsl:stream>
<xsl:accumulator name="min-salary" initial-value="10000000">
  <xsl:accumulator-rule match="employee" 
      select="if (@salary lt $value) then @salary else $value"/>
</xsl:accumulator>