我读了XSLT 3.0 W3C的文档在这里。我想知道如何使用这些元素:
(1) xsl:decimal-format
(2) xsl:stream
(3) xsl:accumulator
(4) xsl:accumulator-rule
(5) xsl:fork
Run Code Online (Sandbox Code Playgroud)
显然,这些是一些较少使用的元素。由于给出的示例有限,因此此处提供的答案将使XSLT的未来学习者受益。有人可以演示如何使用它们吗?
我知道很多要回答。因此,我将反对任何正确的部分答案,以期对其他人有用。
xsl:decimal-format从1.0版开始就在规范中;您引用的其他元素在3.0版中是新增的,并且都与流式传输相关联(即,能够“即时”处理源文档,而无需将整个树加载到内存中)。
<xsl:stream href="in.xml">
...do something...
</xsl:stream>
Run Code Online (Sandbox Code Playgroud)
具有与...基本相同的效果
<xsl:for-each select="doc('in.xml')">
...do something...
</xsl:for-each>
Run Code Online (Sandbox Code Playgroud)
除了流式传输“做某事”(这意味着它必须符合流性性规则)之外。例如,如果您想找出大量员工的平均工资,则可以
<xsl:stream href="in.xml">
<result><xsl:value-of select="avg(//employee/@salary)"/></result>
</xsl:stream>
Run Code Online (Sandbox Code Playgroud)
如果要在输入文档的一次流式传输期间计算最低和最高工资,该怎么办?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>
Run Code Online (Sandbox Code Playgroud)
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>
Run Code Online (Sandbox Code Playgroud)
然后您可以在处理的任何时候通过致电读出最低工资accumulator-before('min-salary')。