2012-08-06 39 views
0

我有一個代理需要對來自服務的輸出消息進行XSL轉換。我附加了序列文件和XSL文件(在synaptic-configs/local-entries)。WSO2 ESB:XSL轉換導致WstxUnexpectedCharException

欣賞您是否可以提示我可能出錯的地方。

這裏的序列文件:

<?xml version="1.0" encoding="UTF-8"?> 
<sequence xmlns="http://ws.apache.org/ns/synapse" name="EmpMergeOutSeq1" trace="enable" statistics="enable"> 
    <log level="full"> 
     <property name="sequence" value="Final Transform using XSLT - begin"/> 
    </log> 
    <xslt key="getEmployeeByIdResponseXlt"/> 
    <send/> 
</sequence> 

這裏的XSL文件:

<?xml version="1.0" encoding="UTF-8"?> 
<localEntry xmlns="http://ws.apache.org/ns/synapse" key="getEmployeeByIdResponseXlt"> 
    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:ax21="http://domain.hrapp.gunith/xsd" xmlns:ns="http://service.hrapp.gunith" xmlns:fn="http://www.w3.org/2005/02/xpath-functions" version="2.0" exclude-result-prefixes="ns fn"> 
     <xsl:output method="xml" omit-xml-declaration="yes" indent="yes"/> 
     <xsl:template match="/"> 
      <xsl:apply-templates select="//ns:getEmployeeByIdResponse"/> 
     </xsl:template> 
     <xsl:template xmlns:ns="http://samples.esb.wso2.org" match="ns:getEmployeeByIdResponse"> 
      <ns1:getEmployeeByIdResponse xmlns:ns1="http://service.proxy.gunith"> 
       <ns1:return xmlns:ax22="http://domain.proxy.gunith/xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="ax22:Employee"> 
        <ax22:dob> 
         <xsl:value-of select="ns:return/ax21:dob"/> 
        </ax22:dob> 
        <ax22:firstName> 
         <xsl:value-of select="ns:return/ax21:firstName"/> 
        </ax22:firstName> 
        <ax22:id> 
         <xsl:value-of select="ns:return/ax21:id"/> 
        </ax22:id> 
        <ax22:lastName> 
         <xsl:value-of select="ns:return/ax21:lastName"/> 
        </ax22:lastName> 
        <ax22:middleName> 
         <xsl:value-of select="ns:return/ax21:middleName"/> 
        </ax22:middleName> 
       </ns1:return> 
      </ns1:getEmployeeByIdResponse> 
     </xsl:template> 
    </xsl:stylesheet> 
</localEntry> 

這裏是日誌條目(其中顯示了錯誤,並通過實際的消息):

[2012-08-04 11:35:44,966] INFO - LogMediator To: /services/MergedBasicEmployeesProxy.MergedBasicEmployeesProxyHttpSoap12Endpoint, WSAction: urn:getEmployeeById, SOAPAction: urn:getEmployeeById, MessageID: urn:uuid:c80fb5a4-41e4-4de4-924d-a18af37b5056, Direction: request, sequence = inSequence - request for EmpMergeProxy, Envelope: <?xml version='1.0' encoding='utf-8'?><soapenv:Envelope xmlns:soapenv="http://www.w3.org/2003/05/soap-envelope"><soapenv:Body><p:getEmployeeById xmlns:p="http://service.proxy.gunith"><!--0 to 1 occurrence--><xs:args0 xmlns:xs="http://service.proxy.gunith">1</xs:args0></p:getEmployeeById></soapenv:Body></soapenv:Envelope> 
[2012-08-04 11:35:44,970] INFO - LogMediator To: /services/MergedBasicEmployeesProxy.MergedBasicEmployeesProxyHttpSoap12Endpoint, WSAction: urn:getEmployeeById, SOAPAction: urn:getEmployeeById, MessageID: urn:uuid:c80fb5a4-41e4-4de4-924d-a18af37b5056, Direction: request, sequence = inSequence - request for EmpMergeProxy, Envelope: <?xml version='1.0' encoding='utf-8'?><soapenv:Envelope xmlns:soapenv="http://www.w3.org/2003/05/soap-envelope"><soapenv:Body><sam:getEmployeeById xmlns:sam="http://service.hrapp.gunith"> 
       <sam:args0>1</sam:args0> 
      </sam:getEmployeeById></soapenv:Body></soapenv:Envelope> 
[2012-08-04 11:35:45,504] INFO - LogMediator To: http://www.w3.org/2005/08/addressing/anonymous, WSAction: , SOAPAction: , MessageID: urn:uuid:ea979246-adbc-494d-bd55-e3ed25171984, Direction: response, sequence = Final Transform using XSLT - begin, Envelope: <?xml version='1.0' encoding='utf-8'?><soapenv:Envelope xmlns:soapenv="http://www.w3.org/2003/05/soap-envelope"><soapenv:Body><ns:getEmployeeByIdResponse xmlns:ns="http://service.hrapp.gunith"><ns:return xmlns:ax21="http://domain.hrapp.gunith/xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="ax21:Employee"><ax21:dob>1984-03-01</ax21:dob><ax21:firstName>Gunith</ax21:firstName><ax21:id>1</ax21:id><ax21:lastName>Dev</ax21:lastName><ax21:middleName>E</ax21:middleName></ns:return></ns:getEmployeeByIdResponse></soapenv:Body></soapenv:Envelope> 
[2012-08-04 11:35:45,505] INFO - LogMediator To: http://www.w3.org/2005/08/addressing/anonymous, WSAction: , SOAPAction: , MessageID: urn:uuid:2eb104c0-53c9-4155-8fef-99e7600b7559, Direction: response, sequence = Final Transform using XSLT - begin, Envelope: <?xml version='1.0' encoding='utf-8'?><soapenv:Envelope xmlns:soapenv="http://www.w3.org/2003/05/soap-envelope"><soapenv:Body><ns:getEmployeeByIdResponse xmlns:ns="http://service.hrapp.gunith"><ns:return xmlns:ax21="http://domain.hrapp.gunith/xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="ax21:Employee"><ax21:dob>1984-03-01</ax21:dob><ax21:firstName>Gunith</ax21:firstName><ax21:id>1</ax21:id><ax21:lastName>Dev</ax21:lastName><ax21:middleName>E</ax21:middleName></ns:return></ns:getEmployeeByIdResponse></soapenv:Body></soapenv:Envelope> 
[2012-08-04 11:35:45,528] ERROR - XSLTMediator Unable to perform XSLT transformation using : Value {name ='null', keyValue ='getEmployeeByIdResponseXlt'} against source XPath : s11:Body/child::*[position()=1] | s12:Body/child::*[position()=1] 
org.apache.axiom.om.OMException: com.ctc.wstx.exc.WstxUnexpectedCharException: Unexpected character '1' (code 49) in prolog; expected '<' 
at [row,col {unknown-source}]: [1,1] 
    at org.apache.axiom.om.impl.builder.StAXOMBuilder.next(StAXOMBuilder.java:296) 
    at org.apache.axiom.om.impl.llom.OMDocumentImpl.getOMDocumentElement(OMDocumentImpl.java:109) 
    at org.apache.axiom.om.impl.builder.StAXOMBuilder.getDocumentElement(StAXOMBuilder.java:570) 
    at org.apache.axiom.om.impl.builder.StAXOMBuilder.getDocumentElement(StAXOMBuilder.java:566) 
    at org.apache.synapse.util.jaxp.StreamResultBuilder.getNode(StreamResultBuilder.java:87) 
    at org.apache.synapse.mediators.transform.XSLTMediator.performXSLT(XSLTMediator.java:298) 
    at org.apache.synapse.mediators.transform.XSLTMediator.mediate(XSLTMediator.java:191) 
    at org.apache.synapse.mediators.AbstractListMediator.mediate(AbstractListMediator.java:60) 
    at org.apache.synapse.mediators.base.SequenceMediator.mediate(SequenceMediator.java:114) 
    at org.apache.synapse.core.axis2.Axis2SynapseEnvironment.injectMessage(Axis2SynapseEnvironment.java:229) 
    at org.apache.synapse.core.axis2.SynapseCallbackReceiver.handleMessage(SynapseCallbackReceiver.java:370) 
    at org.apache.synapse.core.axis2.SynapseCallbackReceiver.receive(SynapseCallbackReceiver.java:160) 
    at org.apache.axis2.engine.AxisEngine.receive(AxisEngine.java:181) 
    at org.apache.synapse.transport.nhttp.ClientWorker.run(ClientWorker.java:275) 
    at org.apache.axis2.transport.base.threads.NativeWorkerPool$1.run(NativeWorkerPool.java:173) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603) 
    at java.lang.Thread.run(Thread.java:679) 

謝謝!

回答

1

問題在於你的xslt腳本..你可以做的是在eclipse中嘗試/任何其他xslt處理器將soap消息作爲輸入xml輸入此xslt腳本並運行。如果腳本正確,你將得到輸出否則不...

+0

感謝您的幫助!發現問題。就像你說的,我對XML有問題。非常仔細的檢查幫助我找到它。 – 2012-12-27 16:42:42

2

我遇到過類似的問題。通常在XSLT轉換過程中處理名稱空間。 WSO2默認使用xalan.jar作爲xml解析器,它必須由saxon9he.jar替換。以下URL供您參考:"How to change the XSLT processor"

謝謝。