使用XSLT覆盖文件

时间:2019-06-06 07:21:45

标签: xml xslt saxon oxygenxml

如何用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>

1 个答案:

答案 0 :(得分:2)

这是XSLT规范中的一条规则,您不能从URI读取它,然后在同一转换中将其写入相同的URI。该规则的原因是XSLT中的操作顺序是不确定的。优化器可能会重新排序,因此读取会在写入之后发生。 (在Saxon-EE中,xsl:result-document使用单独的线程,因此这并不是一个闲聊的威胁:事情发生的顺序通常与您天真地期望的顺序不同。)

您可以使用引用相同基础资源的不同URI来规避规则,后果自负。例如,将多余的/./步骤添加到路径或查询部分?dummy=yes

请注意,如果转换失败,则将清除输入。