Java 使用WSO2 ESB进行XSLT转换时出现问题

Java 使用WSO2 ESB进行XSLT转换时出现问题,java,xml,xslt,wso2,Java,Xml,Xslt,Wso2,我在wso2 esb 4.8.1中使用XSLT中介器来处理XSLT transformer中介器。 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.

我在wso2 esb 4.8.1中使用XSLT中介器来处理XSLT transformer中介器。 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>
synapse代理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转换在其他工具中工作正常,那么异常的原因可能是什么?

代理中的键是正确的。我可能粘贴了错误的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>

本地条目有问题。最后,我通过在synapse配置中添加这样的本地条目,解决了这个问题

   <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文件。

您确定错误消息引用了上面显示的xslt吗?XPath表达式
s11:Body/child::*[position()=1]| s12:Body/child::*[position()=1
在XSLT中找不到。在代理定义中,xsl的键是“XSLT”,但在错误消息中,键值是“xslt1”:如何在ESB中将此xsl定义为本地条目?是否可以共享此本地条目定义?请编辑问题以包含此附加信息并删除此答案。
   <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>