阅读下面的 XProc 问题后:
将 document() 参数传递给 XProc 管道中的 xslt
在 XProc 中将 document-node() 类型参数传递给 XSLT 似乎是不可能的。
所以唯一的解决方法是:生成临时文件并将临时文件的 URL 作为参数传递给 XSLT。
看下面的例子:
大命令.xpl
<?xml version="1.0" encoding="UTF-8"?>
<p:declare-step xmlns:p="http://www.w3.org/ns/xproc"
xmlns:c="http://www.w3.org/ns/xproc-step" version="1.0">
<p:output port="result">
<p:pipe port="result" step="final-calculation"/>
</p:output>
<p:xslt name="generate-temp-data" template-name="main">
<p:input port="source">
<p:empty/>
</p:input>
<p:input port="stylesheet">
<p:document href="generate-temp-data.xsl"/>
</p:input>
<p:input port="parameters">
<p:empty/>
</p:input>
</p:xslt>
<p:store name="store-temp-data" href="temp-data.xml"/>
<p:xslt name="final-calculation" >
<p:input port="source">
<p:document href="source-data.xml"/>
</p:input>
<p:input port="stylesheet">
<p:document href="final-calculation.xsl"/>
</p:input>
<p:with-param name="temp-data" select="/">
<p:pipe port="result" step="store-temp-data"/>
</p:with-param>
</p:xslt>
</p:declare-step>
最终计算.xsl
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
exclude-result-prefixes="xs"
version="2.0">
<xsl:param name="temp-data"/>
<xsl:variable name="temp-data-doc" select="doc($temp-data)"/>
<xsl:template match="/">
<final>
<xsl:for-each select="$temp-data-doc//record">
<xsl:value-of select="."/>
</xsl:for-each>
</final>
</xsl:template>
</xsl:stylesheet>
生成临时数据.xsl
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
exclude-result-prefixes="xs"
version="2.0">
<xsl:template name="main">
<temp-data>
<record>1</record>
<record>2</record>
<record>3</record>
</temp-data>
</xsl:template>
</xsl:stylesheet>
源数据.xml
<?xml version="1.0" encoding="UTF-8"?>
<x/>
我的问题是:
这个解决方案是否有顺序或同步问题?
2018年有什么新的解决方案吗?
如何安全删除临时文件:temp-data.xml?
@grtjn