这可以通过写出两个文件(转换结果和更新的执行次数)通过单个 XSLT 2.0 转换来实现:
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema" exclude-result-prefixes="xs">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:variable name="vRepetitions" select=
"document('file:///c:/temp/delete/numberOfRepetitions.xml')/* +1"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="/">
<xsl:result-document
href="file:///c:/temp/delete/iteration{$vRepetitions}.xml">
<xsl:apply-templates/>
</xsl:result-document>
<xsl:result-document href="file:///c:/temp/delete/numberOfRepetitions.xml">
<n><xsl:value-of select="$vRepetitions"/></n>
</xsl:result-document>
</xsl:template>
</xsl:stylesheet>
涉及两个文件:源 XML 文档和一个包含当前执行次数的文件——后者必须最初创建以包含:
<n>0</n>
当上述转换应用于任何源 XML 文档时(对于本演示,它只是对其应用身份规则),它会进行常规处理并产生所需的结果。此外,转换读取包含当前执行次数的 XML 文档并更新此数字并将更新的(执行次数)文档写回磁盘:
Saxon 9.1.0.5J from Saxonica
Java version 1.6.0_31
Stylesheet compilation time: 625 milliseconds
Processing file:/C:/Program%20Files/Java/jre6/bin/marrowtr.xml
Building tree for file:/C:/Program%20Files/Java/jre6/bin/marrowtr.xml using class net.sf.saxon.tinytree.TinyBuilder
Tree built in 16 milliseconds
Tree size: 4 nodes, 4 characters, 0 attributes
Loading net.sf.saxon.event.MessageEmitter
Building tree for file:///c:/temp/delete/numberOfRepetitions.xml using class net.sf.saxon.tinytree.TinyBuilder
Tree built in 0 milliseconds
Tree size: 4 nodes, 1 characters, 0 attributes
Writing to file:/c:/temp/delete/iteration2.xml
Writing to file:/c:/temp/delete/numberOfRepetitions.xml
Execution time: 140 milliseconds
Memory used: 11477344
NamePool contents: 16 entries in 16 chains. 6 prefixes, 7 URIs
在这里,我们看到在第二次执行时,转换创建了两个文件:
iteration2.xml
包含第二次执行转换的结果。
numberOfRepetitions.xml
如果我们检查这个文件,它在第二次执行后的内容与预期的一样:
. . . .
<n>2</n>