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

时间:2015-02-19 17:04:52

标签: xml xslt mule xslt-2.0

我有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 -   ************************************************** ******************************消息:无法写入多个结果文档   相同的URI,或写入已读取的URI:   file:/ C:/data/local/A/Axyz.txt(net.sf.saxon.trans.DynamicError)代码   :MULE_ERROR-64999   -------------------------------------------------- ------------------------------异常堆栈是:   1.不能将多个结果文档写入同一URI,或写入已读取的URI:   文件:/ C:/data/local/A/Axyz.txt(net.sf.saxon.trans.DynamicError)
  net.sf.saxon.instruct.ResultDocument:300(null)   2.不能将多个结果文档写入同一URI,或写入已读取的URI: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

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

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

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

Mule支持提供了一个补丁。基本上,它们在清除XsltTransformer文件中的参数后重置变压器。