如何用XSLT覆盖现有的(XML)文件?
当前,使用<xsl:result-document/>
时出现以下错误
无法写入已读取的URI
我之前找到了advice来删除文件,但是他们没有说明如何删除。我想知道是否应该有一个更简单的解决方案。
这是示例代码。我在Oxygen XML编辑器20.1中使用Saxon 9.8.0.12
<xsl:variable name="process">
<xsl:apply-templates mode="process" select="doc($processedFile)"/>
</xsl:variable>
<xsl:template match="/">
<xsl:result-document href="{$processedFile}" indent="yes" method="xml">
<xsl:copy-of select="$process"/>
</xsl:result-document>
</xsl:template>
答案 0 :(得分:2)
这是XSLT规范中的一条规则,您不能从URI读取它,然后在同一转换中将其写入相同的URI。该规则的原因是XSLT中的操作顺序是不确定的。优化器可能会重新排序,因此读取会在写入之后发生。 (在Saxon-EE中,xsl:result-document
使用单独的线程,因此这并不是一个闲聊的威胁:事情发生的顺序通常与您天真地期望的顺序不同。)
您可以使用引用相同基础资源的不同URI来规避规则,后果自负。例如,将多余的/./
步骤添加到路径或查询部分?dummy=yes
。
请注意,如果转换失败,则将清除输入。