xsl:decimal-format
присутствует в спецификации с версии 1.0; другие элементы, которые вы цитируете, являются новыми в версии 3.0, и все они связаны с потоковой передачей (то есть с возможностью обрабатывать исходный документ «на лету», без загрузки всего дерева в память).
<xsl:stream href="in.xml">
...do something...
</xsl:stream>
имеет тот же эффект, что и
<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>
и затем в любой момент обработки вы можете узнать минимальную заработную плату, позвонив по телефону accumulator-before('min-salary')
.
person
Michael Kay
schedule
14.09.2014