【问题标题】:Overwrite files with XSLT使用 XSLT 覆盖文件
【发布时间】:2019-10-21 16:23:09
【问题描述】:

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

【问题讨论】:

  • 当您提到 oXygen 时,我认为您可以考虑使用带有 p:xslt 步骤的 XProc,这样您应该能够使用相同的文件进行输入和输出,并且 XProc 将允许您覆盖它一个处理步骤的文件。 oXygen 支持 XProc。使用单个 XSLT 转换无法写入已读取的 URI。
  • 谢谢。我会检查一下。

标签: xml xslt saxon oxygenxml


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-12-29
    • 2014-04-08
    • 2016-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-02
    • 2020-12-26
    相关资源
    最近更新 更多