0

如何使用 XSLT 覆盖现有 (XML) 文件?目前,使用<xsl:result-document/>我得到以下错误

无法写入已读取的 URI

我之前找到了删除文件的建议,但他们没有解释如何。我想知道是否应该有一个更简单的解决方案来做到这一点。

这是示例代码。我在 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>
4

1 回答 1

2

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

您可以通过使用指向相同底层资源的微不足道的 URI 来规避该规则,但风险自负;例如/./,向路径或查询部分添加冗余步骤?dummy=yes

当然要注意,如果你的转换失败,你已经清除了输入。

于 2019-06-06T10:58:51.987 回答