使用xalan进行xml转换会返回一致的结果

时间:2013-02-23 00:39:37

标签: xslt

我们在生产环境中遇到一个奇怪的问题,我们无法在任何环境中复制。订单处理&生成此错误的管理应用程序在一天内处理数千个订单。 4000订单。使用各种xslt转换订单xml,以在订单生命周期过程的每个阶段更新订单数据。 但是,每天一次,订单服务的基础API抛出OrderUpdateException。当xml转换的输出出错时,订单的管理应用程序。内置于应用程序中的订单余量管理使用户能够首先重试或重新提交失败的订单任务。该任务调用无状态会话bean,该bean通过使用xalan应用xml顺序转换来修改订单数据。重试总是成功,用户无需在提交任务之前修改订单数据。

我们知道它首先失败的原因,但不知道是什么原因导致它导致错误的转换。

订购XML:

<GetOrder.Response xmlns="urn:com:metasolv:oms:xmlapi:1">
    <OrderID>243193</OrderID>   
    <_root>
    ....
        <Wireless>
            ...
            ....
            <MDN>
                <Action>NONE</Action>
                ....
                ...
                <Services>
                    <Voice>
                        <ServiceName>VOICE</ServiceName>
                        <ServiceStatus>Initial</ServiceStatus>
                        <FulfillmentItems>
                            <FulfillmentItem index="1353944898394">
                                <FulfillmentItemCode>DCF1</FulfillmentItemCode>                         
                                <FulfillmentMessages/>
                                <Attributes/>
                            </FulfillmentItem>
                            <FulfillmentItem index="1353944898409">
                                <FulfillmentItemCode>HCFB</FulfillmentItemCode>
                                <FulfillmentItemCodeDescription>FC-VOICE</FulfillmentItemCodeDescription>
                                <FulfillmentMessages/>
                                <Attributes/>
                            </FulfillmentItem>
                        </FulfillmentItems>
                    </Voice>
                </Services>
            </MDN>
        </Wireless>
    </_root>
</GetOrder.Response>

XSL:

                                           

<xsl:template match="oms:Wireless">
    <OrderDataUpdate xmlns="http://www.metasolv.com/OMS/OrderDataUpdate">
        <xsl:apply-templates select="oms:MDN"/>
    </OrderDataUpdate>
</xsl:template>

<xsl:template match="oms:MDN">
    <xsl:call-template name="voice_template">
        <xsl:with-param name="mdnId" select="$mdnId"/>
        <xsl:with-param name="oldmdnId" select="$oldmdnId"/>
        ...
    </xsl:call-template>
</xsl:call-template>

<xsl:template name="voice_template"> 
    <xsl:param name="mdnId"/> 
    <xsl:param name="oldmdnId"/> 
    <xsl:param name="minId"/> 
    ....
    .....


    <xsl:for-each select="oms:Services/oms:Voice/oms:FulfillmentItems/oms:FulfillmentItem"> 
        <xsl:variable name="fulfillmentItem_index"> 
            <xsl:value-of select="@index"/> 
        </xsl:variable> 

        <Add path="/Wireless/MDN/Services/Voice/FulfillmentItems/FulfillmentItem[@index='{$fulfillmentItem_index}']/Attributes"> 

        ----
        ----
        </Add>
    <xsl:for-each>
<xsl:template>

<xsl:template match="* | @* | text()">
    <!-- do nothing -->
    <xsl:apply-templates/>
</xsl:template>

转换输出XML:

<?xml version="1.0" encoding="UTF-8"?> 
<OrderDataUpdate xmlns="http://www.metasolv.com/OMS/OrderDataUpdate" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <Add xmlns="" path="1353944898394']/Attributes"> 
        <Attribute> 
            <name>HLR-MSISDN</name> 
            <value>2045731730</value> 
        </Attribute> 
        <Attribute> 
            <name>HLR-IMSI</name> 
            <value>302660397124421</value> 
        </Attribute> 
        <Attribute> 
            <name>HLR-NON_MTS_IMSI</name> 
            <value>302370397124421</value> 
        </Attribute> 
    </Add> 
    <Add xmlns="" path="/Wireless/MDN/Services/Voice/FulfillmentItems/FulfillmentItem[@index='1353944898409']/Attributes"> 
    <Attribute> 
        <name>HLR-MSISDN</name> 
        <value>2045731730</value> 
    </Attribute> 
    ....
<OrderDataUpdate>

我们发现在for循环的第一次迭代期间,为变量“fulfillmentItem_index”设置了错误的值。对于连续迭代,正在设置正确的值。 结果,应用程序抛出OrderUpdateException并停止处理特定的顺序。然而,在重新提交相同的任务时,订单流程将恢复,就好像首先没有发生任何事情一样。

该应用程序在Weblogic Application Server 9.2 MP3上运行。我们还进行了环境检查,这就是它的内容:

。我进行了环境检查,这就是它的内容。

<checkEnvironmentExtension> 
     <EnvironmentCheck version="$Revision: 1.29 $"> 
          <environment> 
               <item key="version.DOM.draftlevel">2.0fd</item> 
               <item key="java.class.path">:/home/weblogic/bea/patch_weblogic923/profiles/default/sys_manifest_classpath/weblogic_patch.jar:/opt/java1.5/lib/tools.jar:/home/weblogic/bea/weblogic92/server/lib/Bug8841241_920mp1.jar:/home/weblogic/bea/weblogic92/server/lib/weblogic_sp.jar:/home/weblogic/bea/weblogic92/server/lib/weblogic.jar:/home/weblogic/bea/weblogic92/server/lib/webservices.jar::/home/weblogic/bea/weblogic92/common/eval/pointbase/lib/pbclient51.jar:/home/weblogic/bea/weblogic92/server/lib/xqrl.jar:/home/weblogic/AQJMSHOME/AQJMS/StartupClass/lib/WLS9.0/AQJMSStartupClass.jar:/home/weblogic/AQJMSHOME/jar_files/aqapi13.jar:</item> 
               <item key="version.JAXP">1.1 or higher</item> 
               <item key="java.ext.dirs">/opt/java1.5/jre/lib/ext</item> 
               <item key="version.xerces2">Xerces-J 2.8.1</item> 
               <item key="version.xerces1">Xerces 1.4.4</item> 
               <item key="version.xalan2_2">Xalan Java 2.7.0</item> 
               <item key="version.xalan1">not-present</item> 
               <item key="version.ant">Apache Ant version 1.6.2 compiled on August 5 2004</item> 
               <item key="java.version">1.5.0.17</item> 
               <item key="version.DOM">2.0</item> 
               <item key="version.crimson">not-present</item> 
               <item key="sun.boot.class.path">/opt/java1.5/jre/lib/rt.jar:/opt/java1.5/jre/lib/i18n.jar:/opt/java1.5/jre/lib/sunrsasign.jar:/opt/java1.5/jre/lib/jsse.jar:/opt/java1.5/jre/lib/jce.jar:/opt/java1.5/jre/lib/charsets.jar:/opt/java1.5/jre/classes</item> 
               <item key="version.SAX">2.0</item> 
               <item key="version.xalan2x">Xalan Java 2.7.0</item> 
          </environment> 
          <status result="OK"/> 
     </EnvironmentCheck> 
</checkEnvironmentExtension>

感谢有人能帮助我解释这种奇怪的行为。我们每天都会看到这种情况,至少有1或2个订单经常失败。

提前致谢。

1 个答案:

答案 0 :(得分:1)

艰难的一个。你当然没有为这里的任何人提供足够的信息来提出答案。但我会检查您是使用Apache版本的Xerces而不是Sun / Oracle JDK版本。后者是错误的,根据我的经验,错误通常是属性值的损坏。这个错误是在几年前提出的,很明显甲骨文无意修复它。

相关问题