我有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> </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> </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> </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
答案 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
文件中的参数后重置变压器。