Mule 3.4.2 XSLT Transformer throws 无法将多个结果文档写入同一 URI,或写入已读取的 URI

Mule 3.4.2 XSLT Transformer throws Cannot write more than one result document to the same URI, or write to a URI that has been read

我有 XML 来了一个骡子流。我需要将这个 xml 分成 3 个不同的 xml 并写入 3 个文件。这就是我在 mule flow 中调用 XSLT Transformer 的方式。

    <xm:xslt-transformer xsl-file="xsl/xml-to-file.xsl">
        <xm:context-property key="A_loc" value="${location.a}" />
        <xm:context-property key="B_loc" value="${location.b}" />
        <xm:context-property key="C_loc" value="${location.c}" />
    </xm:xslt-transformer>

xsl 是这样定义的:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:output method="text" />

<xsl:param name="A_loc" />
<xsl:param name="B_loc" />
<xsl:param name="C_loc" />

<xsl:template match="/">
    <xsl:apply-templates select="//table[@name='A_DATA']" />
    <xsl:apply-templates select="//table[@name='B_DATA']" />
    <xsl:apply-templates select="//table[@name='C_DATA']" />
</xsl:template>

<xsl:template match="table[@name='A_DATA']">
    <xsl:result-document href="{$A_loc}" >
        <xsl:for-each select="row">
            <xsl:for-each select="field">
                .... some logic
            </xsl:for-each>
            <xsl:text>&#13;</xsl:text>
        </xsl:for-each>
    </xsl:result-document>
</xsl:template>

<xsl:template match="table[@name='B_DATA']">
    <xsl:result-document href="{$B_loc}">
        <xsl:for-each select="row">
            <xsl:for-each select="field">
                ... some logic
            </xsl:for-each>
            <xsl:text>&#13;</xsl:text>
        </xsl:for-each>
    </xsl:result-document>
</xsl:template>

<xsl:template match="table[@name='C_DATA']">
    <xsl:result-document href="{$C_loc}">
        <xsl:for-each select="row">
            <xsl:for-each select="field">
                ... some logic
            </xsl:for-each>
            <xsl:text>&#13;</xsl:text>
        </xsl:for-each>
    </xsl:result-document>
</xsl:template>

此进程按特定频率安排 运行。启动服务器后第一次,它 运行 没问题,但所有后续 运行 都失败并显示此消息

org.mule.exception.DefaultMessagingExceptionStrategy - ******************************************************************************** Message : Cannot write more than one result document to the same URI, or write to a URI that has been read: file:/C:/data/local/A/Axyz.txt (net.sf.saxon.trans.DynamicError) Code : MULE_ERROR-64999 -------------------------------------------------------------------------------- Exception stack is: 1. Cannot write more than one result document to the same URI, or write to a URI that has been read: file:/C:/data/local/A/Axyz.txt(net.sf.saxon.trans.DynamicError)
net.sf.saxon.instruct.ResultDocument:300 (null) 2. Cannot write more than one result document to the same URI, or write to a URI that has been read: file:/C:/data/local/A/Axyz.txt (net.sf.saxon.trans.DynamicError) (org.mule.api.transformer.TransformerException)
org.mule.module.xml.transformer.XsltTransformer:188


我检查过 mule 正在使用 saxon 8.9.0.4-osgi, saxon-dom 8.9.0.4-osgi and saxon-xqj 8.9.0.4

xsl:result-document 并非旨在追加或覆盖文件。如果您需要覆盖,则必须使用 xslt 之前的组件在重新创建之前删除或备份您的文件。

我推荐的另一种可能性是同时滥用 xslt 转换器和 Saxon 的源代码 OutputURIResolver,但我真的相信这个。

这是 Mule 3.4.2 中的错误,已在此处解决。

https://www.mulesoft.org/jira/browse/MULE-5382

Mu​​le 支持为此提供了补丁。基本上,他们在清除 XsltTransformer 文件中的参数后重置变压器。