MULE:如何在MEL中使用CDATA

MULE:如何在MEL中使用CDATA,mule,mule-studio,mel,mule-el,Mule,Mule Studio,Mel,Mule El,请帮助我解决此错误。我已通过mainflow中的会话变量捕获了原始有效负载。在错误场景中,我有另一个子流,其中我使用了消息属性转换器和XSLT转换器。因此,当我尝试放置格式错误的xml时(尝试创建解析器异常)。在XSLT transformer中,抛出类似“Element type”的错误messageNamestr1234“必须后跟属性规范“>”或“/>” 实际上,我的逻辑是,在错误场景中,我应该构造xml——其中一个字段需要捕获原始有效负载。在所有其他测试场景中,它似乎工作正常(正确生成xm

请帮助我解决此错误。我已通过mainflow中的会话变量捕获了原始有效负载。在错误场景中,我有另一个子流,其中我使用了
消息属性转换器
XSLT转换器
。因此,当我尝试放置格式错误的xml时(尝试创建解析器异常)。在XSLT transformer中,抛出类似“Element type”的错误messageNamestr1234“必须后跟属性规范“>”或“/>”

实际上,我的逻辑是,在错误场景中,我应该构造xml——其中一个字段需要捕获
原始有效负载
。在所有其他测试场景中,它似乎工作正常(正确生成xml)。但仅对于解析器异常,消息不会传播到队列中,因为XSLT抛出错误。请找到我的配置xml

        <flow name="mainFlow" doc:name="MessageFlow"
    tracking:enable-default-events="true">

    <wmq:inbound-endpoint queue="InQUEUE"
        tracking:enable-default-events="true" connector-ref="WMQ_Connector"
        doc:name="queue" doc:description="Flow">
        <wmq:transaction action="ALWAYS_BEGIN" />
    </wmq:inbound-endpoint>
    <byte-array-to-string-transformer doc:name="Byte Array to String"/>
    <set-session-variable variableName="originalPayload" value="#[payload]" doc:name="Store_Payload"/> 
    <logger message="***change*#[message.payloadAs(java.lang.Object)]*****" level="INFO" doc:name="Logger"/>
    <mulexml:dom-to-xml-transformer></mulexml:dom-to-xml-transformer>
              <set-session-variable variableName="operation"
        value="#[xpath('fn:local-name(/root/*[2])')]" doc:name="Set_Operation" doc:description="separate Operation"/>       
    ..........
    <choice-exception-strategy doc:name="Choice Exception Strategy" doc:description="used to differenciate system and application error">
        <catch-exception-strategy doc:name="Catch_ApplicationFailure_Messages"
            when="#[exception.causedBy(org.mule.api.MessagingException)]" doc:description="Catches all the application errors and call the error handling subflow to log the error messages">
            <flow-ref name="Common_ErrorHandling_SubFlow" doc:name="Invoke_Common_ErrorHandling_SubFlow" />
        </catch-exception-strategy>

        <rollback-exception-strategy
            maxRedeliveryAttempts="3" doc:name="Catch_SystemFailure_Messages" doc:description="Message Processor catches system error and tries to retry for 3 times and finally put the message in queue"> 
        ................        
        </rollback-exception-strategy>
    </choice-exception-strategy>
</flow>

     <sub-flow name="Common_ErrorHandling_SubFlow" doc:name="Common_ErrorHandling_SubFlow"
    tracking:enable-default-events="true">

    <logger message="***enetered**" level="INFO" doc:name="Logger"/>

    <message-properties-transformer
        doc:name="Catch_MessageProperties" doc:description="Used to capture project and message specific information" scope="outbound">

        <add-message-property key="InterfaceName" value="'Requests'" />
        <add-message-property key="ProjectName" value="'NewProject'" />
        ..........
        <add-message-property key="JMSMessageID"
            value="#[header:INBOUND:JMSMessageID]" />
        <add-message-property key="MuleMessageID"
            value="#[header:INBOUND:MULE_MESSAGE_ID]" />
        <add-message-property key="ExceptionPayload"
            value="#[exception]" />
        <add-message-property key="originalPayload" value="#[sessionVars.originalPayload]"/>
    </message-properties-transformer>
    <byte-array-to-string-transformer doc:name="Byte Array to String"/>

    <mulexml:xslt-transformer
        maxIdleTransformers="2" maxActiveTransformers="5"
        doc:name="Generate_ErrorXmlStructure" xsl-file="XSLTScript.txt" doc:description="XSLT transformer used to generate standard xml message with its scripts">
        <mulexml:xslt-text>
        </mulexml:xslt-text>

        <mulexml:context-property key="ProjectName"
            value="#[header:OUTBOUND:ProjectName]" />
        .........
        <mulexml:context-property key="DetailsExceptionMessage"
            value="#[header:OUTBOUND:DetailsExceptionMessage]" />
        <mulexml:context-property key="OriginalPayload"
            value="#[header:OUTBOUND:originalPayload]" />
        <mulexml:context-property key="MessageInDate"
            value="#[header:OUTBOUND:MessageInDate]" />
        <mulexml:context-property key="InputQueue"
            value="#[header:OUTBOUND:InputQueue]" />
    </mulexml:xslt-transformer>

    <wmq:outbound-endpoint queue="ERROR"
        connector-ref="WMQ_Connector" doc:name=".ERROR" doc:description="Used to log error messages">
        <wmq:transaction action="ALWAYS_JOIN"/>
    </wmq:outbound-endpoint>
</sub-flow>

..........
................        
..........
.........
假设:由于它是解析器异常,XSLT Transformer例外于标准xml结构(在捕获负载时)。所以考虑在CDATA中进行路由。不确定如何进行路由。还尝试了XSLT transformer中上下文属性中的各种选项

       1. <mulexml:context-property key="OriginalPayload"
            value="#[message.outboundproperies.originalPayloadAs(java.lang.Object)]" /> 
       2.<mulexml:context-property key="OriginalPayload"
            value="#[header:SESSION:originalPayload]" />
       3.<mulexml:context-property key="OriginalPayload"
            value="#[!CDATA[sessionVars.originalPayload]]" />
1。
2.
3.
但是没有希望。请帮我一下

@戴维多索特:我已经添加了我的XLST scipt,并按照你的建议更改了参数

      <xsl:stylesheet version="2.0"
                    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
                    <xsl:output omit-xml-declaration="yes" cdata-section-elements="OriginalPayload" />
                    <xsl:param name="InterfaceName" />
                    <xsl:param name="ProjectName" />
                       ..........
                    <xsl:param name="OriginalPayload" />
                    <xsl:param name="MessageInDate" />
                    <xsl:template match="*">
                        <Specific>
                            <ProjectName>
                                <xsl:value-of select="$ProjectName" />
                            </ProjectName>
                            <InterfaceName>
                                <xsl:value-of select="$InterfaceName" />
                            </InterfaceName>
                                .......
                           <OriginalPayload>
                            <xsl:value-of select="$OriginalPayload"/>
                        </OriginalPayload> 
                 </Specific>
                    </xsl:template>
                </xsl:stylesheet>

..........
.......
此外,我还添加了上下文属性

                    <mulexml:context-property key="OriginalPayload"
            value="#[sessionVars.originalPayload]" />

我仍然面临着同样的错误。我尝试了多个选项1。删除了省略xml声明2。在xslt中编辑了许多属性并尝试了。没有希望。请告诉我哪里出了问题

@DavidSott请查找我的输入xml(从messageName字段中删除>以检查流中的解析器异常行为)


str1234
12345
123
str1
2012-12-13T12:12:12

由于原始有效负载是一个字符串,您应该能够使用以下命令将其直接传递给XSL-T:

<mulexml:context-property key="OriginalPayload"
        value="#[sessionVars.originalPayload]" />

PS.
header:OUTBOUND
不推荐使用
message.outboundProperties

Hi@David Dossot-谢谢。我已经按照你的建议更改了属性。仍然面临同样的问题。我已经编辑了上面的配置并添加了XLST脚本。请看一眼。提前感谢。我已经尝试了上面的XSL,它工作得非常好:
OriginalPayload
被包装在CDATA块中。您肯定还有其他问题,但就XSL而言,我的解决方案是有效的。谢谢@DavidDossot。是的,我们可以将有效负载包装在CDATA中。但是,只有当我们尝试查找解析器错误消息时,问题才会出现。我们得到的错误像
lineNumber:11;栏目号:24;元素类型“messageNamestr1234”后面必须跟属性规范“>”或“/>”
。它适用于除解析器异常之外的所有其他异常。消息一输入XSLT transformer,就会抛出错误。我已经编辑了上面的配置并给出了输入xml。请看一眼。提前谢谢。当我们将原始有效负载存储在会话变量本身中时,是否可以通过MEL将其包装在CDATA中。否:CDATA纯粹是一个XML序列化问题,在MEL级别无法执行任何操作。我在您的问题中找不到您收到的XSL-t错误:您可以添加它吗?另外,您确定要传递给XSL的所有
上下文属性
值都是字符串吗?
<mulexml:context-property key="OriginalPayload"
        value="#[sessionVars.originalPayload]" />
<xsl:output cdata-section-elements="yourElementNameHere"/>