2014-10-08 146 views
0

我正在使用wso2 esb中的XSLT mediator使用XSLT变换器中介器4.8.1。 的XSLT是:使用WSO2 ESB进行XSLT转换的问题

<xsl:stylesheet version="1.0" 
     xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
     xmlns:fn="http://www.w3.org/2005/02/xpath-functions" 
     xmlns:ns="http://ep.service.ims.com" 
     xmlns:ax21="http://ep.service.ims.com/xsd" 
     exclude-result-prefixes="ns fn"> 
    <xsl:param name="amount"/> 
    <xsl:output method="xml" omit-xml-declaration="yes" indent="yes"/> 

    <xsl:template match="/"> 
     <xsl:apply-templates select="//ns:getResponse" /> 
    </xsl:template> 

    <xsl:template match="ns:getResponse" xmlns:ns="http://ep.service.ims.com"> 
     <ep:credit xmlns:ep="http://ep.service.ims.com" xmlns:xsd="http://ep.service.ims.com/xsd"> 
      <ep:info> 
       <xsd:amount> 
        <xsl:value-of select="$amount"/> 
       </xsd:amount> 
       <xsd:personInfo> 
        <xsd:address> 
         <xsl:value-of select="ns:return/ax21:address"/> 
        </xsd:address> 
        <xsd:id> 
         <xsl:value-of select="ns:return/ax21:id"/> 
        </xsd:id> 
        <xsd:name> 
         <xsl:value-of select="ns:return/ax21:name"/> 
        </xsd:name> 
       </xsd:personInfo> 
      </ep:info> 
     </ep:credit> 
    </xsl:template> 
</xsl:stylesheet> 

,并请求XML是:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"> 
    <soapenv:Body> 
     <ns:getResponse xmlns:ns="http://ep.service.ims.com"> 
     <ns:return xsi:type="ax23:PersonInfo" xmlns:ax23="http://ep.service.ims.com/xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
      <ax23:address>IMS Heath, Omega C, India, bnag</ax23:address> 
      <ax23:id>100</ax23:id> 
      <ax23:name>WSO2</ax23:name> 
     </ns:return> 
     </ns:getResponse> 
    </soapenv:Body> 
</soapenv:Envelope> 

我试图在Eclipse中XSLT转换和像(http://xslt.online-toolz.com/tools/xslt-transformation.php)一些在线工具,它是工作的罚款。然而,当我试图在WSO2 ESB一样,我对着下面的异常.....

org.apache.synapse.mediators.transform.XSLTMediator} - 
    Fatal error occurred in stylesheet parsing : 
    net.sf.saxon.trans.XPathException: 
    The supplied file does not appear to be a stylesheet Value {name ='null', keyValue ='xslt1'} 
{org.apache.synapse.mediators.transform.XSLTMediator} 
    javax.xml.transform.TransformerConfigurationException: Failed to compile stylesheet. 1 error detected. 
    at net.sf.saxon.PreparedStylesheet.prepare(PreparedStylesheet.java:220) 
org.apache.synapse.core.axis2.SynapseCallbackReceiver.receive(SynapseCallbackReceiver.java:170) 
    at org.apache.axis2.engine.AxisEngine.receive(AxisEngine.java:180) 
    at org.apache.synapse.transport.passthru.ClientWorker.run(ClientWorker.java:225) 
TID: [0] [ESB] [2014-10-08 13:53:20,705] ERROR 
{org.apache.synapse.mediators.transform.XSLTMediator} - 
    Unable to perform XSLT transformation using : 
    Value {name ='null', keyValue ='xslt1'} against source XPath : s11:Body/child::*[position()=1] | s12:Body/child::*[position()=1] 
    reason : Error creating XSLT transformer using : Value {name ='null', keyValue ='xslt1'} 
{org.apache.synapse.mediators.transform.XSLTMediator} 
    org.apache.synapse.SynapseException: Error creating XSLT transformer using : Value {name ='null', keyValue ='xslt1'} at 
org.apache.synapse.mediators.AbstractMediator.handleException(AbstractMediator.java:313) 
    Caused by: javax.xml.transform.TransformerConfigurationException: 
    Failed to compile stylesheet. 1 error detected. 

突触代理XML是:

<?xml version="1.0" encoding="UTF-8"?> 
<proxy xmlns="http://ws.apache.org/ns/synapse" name="CreditProxy" transports="https http" startOnLoad="true" trace="disable"> 
    <target> 
     <inSequence> 
     <log level="full"> 
      <property name="sequence" value="inSequence - request for CreditProxy"/> 
     </log> 
     <property xmlns:pep="http://com.ims.proxy" name="ORG_ID" expression="//pep:credit/pep:id"/> 
     <property xmlns:pep="http://com.ims.proxy" name="ORG_AMOUNT" expression="//pep:credit/pep:amount"/> 
     <enrich> 
      <source type="inline" clone="true"> 
       <pep:get xmlns:pep="http://ep.service.ims.com"> 
        <pep:id>?</pep:id> 
       </pep:get> 
      </source> 
      <target type="body"/> 
     </enrich> 
     <enrich> 
      <source type="property" property="ORG_ID"/> 
      <target xmlns:pep="http://ep.service.ims.com" xpath="//pep:get/pep:id"/> 
     </enrich> 
     <log level="full"> 
      <property name="sequence" value="inSequence - request for PersonInfoService"/> 
     </log> 
     <property name="STATE" value="PERSON_INFO_REQUEST"/> 
     <send> 
      <endpoint key="PersonInfoEpr"/> 
     </send> 
    </inSequence> 
    <outSequence> 
     <switch source="get-property('STATE')"> 
      <case regex="PERSON_INFO_REQUEST"> 
       <log level="full"> 
        <property name="sequence" value="outSequence - STATE 01 - response from PersonInfoService"/> 
       </log> 
       <xslt key="xslt"> 
        <property name="amount" expression="get-property('ORG_AMOUNT')"/> 
       </xslt> 
       <log level="full"> 
        <property name="sequence" value="outSequence - STATE 01 - request for CreditService"/> 
       </log> 
       <property name="STATE" value="CREDIT_REQUEST"/> 
       <send> 
        <endpoint key="CreditEpr"/> 
       </send> 
      </case> 
      <case regex="CREDIT_REQUEST"> 
       <log level="full"> 
        <property name="sequence" value="outSequence - STATE 02 - response from CreditService"/> 
       </log> 
       <send/> 
      </case> 
     </switch> 
    </outSequence> 
    </target> 
    <publishWSDL uri="file:resources/CreditProxy.wsdl"/> 
</proxy> 

什么可能是例外,如果事业XSLT转换在其他工具中工作正常吗?

+0

您确定错误消息引用了上面显示的XSLT吗? XPath表达式s11:Body/child :: * [position()= 1] | s12:Body/child :: * [position()= 1'在XSLT中找不到。 – 2014-10-08 09:40:14

+0

在你的代理def中,你的xsl的键是'xslt',但是在你的错误信息中,keyValue是'xslt1':你如何在ESB中定义这个xsl作为本地条目?你能分享这个本地入口def吗? – 2014-10-08 10:13:56

回答

0

有与当地条目的问题。最后,我能够通过突触配置

<localEntry key="xslt99"> 
     <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
         xmlns:ax21="http://ep.service.ims.com/xsd" 
         xmlns:ns="http://ep.service.ims.com" 
         xmlns:fn="http://www.w3.org/2005/02/xpath-functions" 
         version="1.0" 
         exclude-result-prefixes="ns fn"> 
     <xsl:param name="amount"/> 
     <xsl:output method="xml" omit-xml-declaration="yes" indent="yes"/> 
     <xsl:template match="/"> 
      <xsl:apply-templates select="//ns:getResponse"/> 
     </xsl:template> 
     <xsl:template match="ns:getResponse"> 
      <ep:credit xmlns:ep="http://ep.service.ims.com" xmlns:xsd="http://ep.service.ims.com/xsd"> 
       <ep:info> 
        <xsd:amount> 
        <xsl:value-of select="$amount"/> 
        </xsd:amount> 
        <xsd:personInfo> 
        <xsd:address> 
         <xsl:value-of select="ns:return/ax21:address"/> 
        </xsd:address> 
        <xsd:id> 
         <xsl:value-of select="ns:return/ax21:id"/> 
        </xsd:id> 
        <xsd:name> 
         <xsl:value-of select="ns:return/ax21:name"/> 
        </xsd:name> 
        </xsd:personInfo> 
       </ep:info> 
      </ep:credit> 
     </xsl:template> 
     </xsl:stylesheet> 
     <description/> 
    </localEntry> 

最初我是想增加这样

<localEntry xmlns="http://ws.apache.org/ns/synapse" key="xslt1" src="file:resources/creditproxy/personToCredit.xslt"></localEntry> 

的本地条目添加这样的本地条目来解决这个问题,但我还是穿上”不知道如何在本地条目中指定xslt文件。

0

代理中的密钥是正确的。我可能已经贴上了错误的XML代理,

这里是代理:

<?xml version="1.0" encoding="UTF-8"?> 
<proxy xmlns="http://ws.apache.org/ns/synapse" 
     name="CreditProxy" 
     transports="https,http" 
     statistics="disable" 
     trace="disable" 
     startOnLoad="true"> 
    <target> 
     <inSequence> 
     <log level="full"> 
      <property name="sequence" value="inSequence - request for CreditProxy"/> 
     </log> 
     <property xmlns:pep="http://com.ims.proxy" 
        name="ORG_ID" 
        expression="//pep:credit/pep:id"/> 
     <property xmlns:pep="http://com.ims.proxy" 
        name="ORG_AMOUNT" 
        expression="//pep:credit/pep:amount"/> 
     <enrich> 
      <source type="inline" clone="true"> 
       <pep:get xmlns:pep="http://ep.service.ims.com"> 
        <pep:id>?</pep:id> 
       </pep:get> 
      </source> 
      <target type="body"/> 
     </enrich> 
     <enrich> 
      <source type="property" clone="true" property="ORG_ID"/> 
      <target xmlns:pep="http://ep.service.ims.com" xpath="//pep:get/pep:id"/> 
     </enrich> 
     <log level="full"> 
      <property name="sequence" value="inSequence - request for PersonInfoService"/> 
     </log> 
     <property name="STATE" value="PERSON_INFO_REQUEST"/> 
     <send> 
      <endpoint key="PersonInfoEpr"/> 
     </send> 
     </inSequence> 
     <outSequence> 
     <switch source="get-property('STATE')"> 
      <case regex="PERSON_INFO_REQUEST"> 
       <log level="full"> 
        <property name="sequence" 
          value="outSequence - STATE 01 - response from PersonInfoService"/> 
       </log> 
       <xslt key="xslt1"> 
        <property name="amount" expression="get-property('ORG_AMOUNT')"/> 
       </xslt> 
       <log level="full"> 
        <property name="sequence" 
          value="outSequence - STATE 01 - request for CreditService"/> 
       </log> 
       <property name="STATE" value="CREDIT_REQUEST"/> 
       <send> 
        <endpoint key="CreditEpr"/> 
       </send> 
      </case> 
      <case regex="CREDIT_REQUEST"> 
       <log level="full"> 
        <property name="sequence" 
          value="outSequence - STATE 02 - response from CreditService"/> 
       </log> 
       <send/> 
      </case> 
     </switch> 
     </outSequence> 
    </target> 
    <publishWSDL uri="file:resources/creditproxy/CreditProxy.wsdl"/> 
    <description/> 
</proxy> 

本地条目:

<localEntry xmlns="http://ws.apache.org/ns/synapse" key="xslt1" src="file:resources/creditproxy/personToCredit.xslt"></localEntry> 
+2

请编辑您的问题以包含此附加信息并删除该答案。 – 2014-10-08 12:45:53