简体   繁体   English

仅复制 WSO2 SOAP 信封中的内部元素并添加新的命名空间

[英]Copy only the inner elements in a WSO2 SOAP envelope and add a new namespace

can you help?你能帮我吗?

I am trying to extract the core elements from a WSO2 SOAP envelope and forward it to another SOAP service.我试图从 WSO2 SOAP 信封中提取核心元素并将其转发到另一个 SOAP 服务。

Any help is appreciated, thanks for reading任何帮助表示赞赏,感谢阅读

the BEFORE shows the input message I receive, the AFTER shows the progress I've made so far, the DESIRED is the output I want and the FINAL OUTPUT will enclose the DESIRED in an element called request , the request element is static so it does not need to be in the XSLT transformation and can be excluded from the XSLT transform if it simplifies the solution. BEFORE 显示我收到的输入消息,AFTER 显示我到目前为止取得的进展,DESIRED 是我想要的输出,FINAL OUTPUT 将把 DESIRED 包含在一个名为request的元素中,请求元素是静态的,所以它不需要在 XSLT 转换中,如果它简化了解决方案,可以从 XSLT 转换中排除。

BEFORE:前:

<por:ReadMostRecentPrices xmlns:por="http://PAS_1_1.ESB.OOO.com">
         <header>
            <sourceSystem>EDQC</sourceSystem>
            <userName>someguy</userName>
            <createdUtc>2020-10-10</createdUtc>
            <notes>dev test</notes>
            <serviceKey>password-not</serviceKey>
            <serverEnvironmentType>development</serverEnvironmentType>
         </header>
         <mostRecentPricesSet>
            <securityDurableKeys>
               <securityDurableKey>LZ0080300001</securityDurableKey>
               <securityDurableKey>LZ0080300002</securityDurableKey>
            </securityDurableKeys>
            <priceScheme>01</priceScheme>
            <date>2020-10-10</date>
         </mostRecentPricesSet>
      </por:ReadMostRecentPrices>

AFTER:后:

    <por:ReadMostRecentPrices xmlns:por="http://PAS_1_1.ESB.OOO.com">
             <mostRecentPricesSet>
                <urn:securityDurableKeys xmlns:urn="urn:epaservice">
                   <securityDurableKey>LZ0080300001</securityDurableKey>
                   <securityDurableKey>LZ0080300002</securityDurableKey>
                </urn:securityDurableKeys>
                <urn:priceScheme xmlns:urn="urn:epaservice">01</urn:priceScheme>
                <urn:date xmlns:urn="urn:epaservice">2020-10-10</urn:date>
             </mostRecentPricesSet>
          </por:ReadMostRecentPrices>

DESIRED:期望:

    <urn:securityDurableKeys xmlns:urn="urn:epaservice">
      <urn:securityDurableKey>LZ0080300001</urn:securityDurableKey>
      <urn:securityDurableKey>LZ0080300002</urn:securityDurableKey>
    </urn:securityDurableKeys>
    <urn:priceScheme xmlns:urn="urn:epaservice">01</urn:priceScheme>
    <urn:date xmlns:urn="urn:epaservice">2020-10-10</urn:date>

FINAL OUTPUT最终输出

<?xml version="1.0" encoding="UTF-8"?>
<urn:request xmlns:urn="urn:epaservice">
  <urn:securityDurableKeys>
    <urn:securityDurableKey>LZ0080300001</urn:securityDurableKey>
    <urn:securityDurableKey>LZ0080300002</urn:securityDurableKey>
  </urn:securityDurableKeys>
  <urn:priceScheme>01</urn:priceScheme>
  <urn:date>2020-10-10</urn:date>
</urn:request>

this my XSLT:这是我的 XSLT:

         <?xml version="1.0" encoding="UTF-8"?>
         <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt" version="1.0" exclude-result-prefixes="msxsl" xmlns:urn="urn:epaservice" xmlns:PortfolioAccountingService_1_1="http://PAS_1_1.ESB.OOO.com">
           <xsl:output method="xml" omit-xml-declaration="yes" indent="yes">
           </xsl:output>
           <xsl:template match="@* | node()">
             <xsl:copy>
               <xsl:apply-templates select="@* | node()">
               </xsl:apply-templates>
             </xsl:copy>
           </xsl:template>
           <!-- Removes the header START -->
           <xsl:template match="header">
           </xsl:template>
           <!-- Removes the header END -->
           <!-- mostRecentPrices operation START -->
           <xsl:template match="PortfolioAccountingService_1_1:ReadMostRecentPrices/mostRecentPricesSet/*">
             <xsl:element name="urn:{local-name()}" namespace="urn:epaservice">
               <xsl:apply-templates select="@* | node()"/>
             </xsl:element>
           </xsl:template>
           <xsl:template match="PortfolioAccountingService_1_1:ReadMostRecentPrices/mostRecentPricesSet/securityDurableKeys/*">
             <xsl:element name="urn:{local-name()}" namespace="urn:epaservice">
               <xsl:apply-templates select="@* | node()"/>
             </xsl:element>
           </xsl:template>
           <!-- mostRecentPrices operation END -->
         </xsl:stylesheet>

Constraints or gotchas:限制或陷阱:

  • I am using Windows PowerShell and System.Xml.Xsl.XslCompiledTransform to test my transform which works perfectly if I use <xsl:template match="/"> in the first template match我正在使用 Windows PowerShell 和 System.Xml.Xsl.XslCompiledTransform 来测试我的转换,如果我在第一个模板匹配中使用 <xsl:template match="/"> 可以完美地工作
  • The production system uses org.apache.synapse.mediators.transform.XSLTMediator, and when I use the directive <xsl:template match="/"> the Apache XSLT processor fails with the error in bold below生产系统使用 org.apache.synapse.mediators.transform.XSLTMediator,当我使用指令 <xsl:template match="/"> 时,Apache XSLT 处理器失败并出现下面粗体显示的错误
  • It seems like I have to use <xsl:template match="@* | node()">似乎我必须使用 <xsl:template match="@* | node()">

TID: [0] [ESB] [2020-10-09 09:02:24,722] ERROR {org.apache.synapse.mediators.transform.XSLTMediator} - Unable to perform XSLT transformation using : Value {name ='null', keyValue ='PortfolioAccountingService_1_1_EPAOutbound_XSLT'} against source XPath : s11:Body/child:: [position()=1] | TID: [0] [ESB] [2020-10-09 09:02:24,722] 错误 {org.apache.synapse.mediators.transform.XSLTMediator} - 无法执行 XSLT 转换使用:值 {name ='null', keyValue ='PortfolioAccountingService_1_1_EPAOutbound_XSLT'} 针对源 XPath : s11:Body/child:: [position()=1] | s12:Body/child:: [position()=1] reason : javax.xml.stream.XMLStreamException: ParseError at [row,col]:[8,14] Message: The markup in the document following the root element must be well-formed. s12:Body/child:: [position()=1] 原因:javax.xml.stream.XMLStreamException: ParseError at [row,col]:[8,14] 消息:文档中根元素后面的标记必须是形式良好。 {org.apache.synapse.mediators.transform.XSLTMediator} org.apache.axiom.om.OMException: javax.xml.stream.XMLStreamException: ParseError at [row,col]:[8,14] Message: The markup in the document following the root element must be well-formed. {org.apache.synapse.mediators.transform.XSLTMediator} org.apache.axiom.om.OMException: javax.xml.stream.XMLStreamException: ParseError at [row,col]:[8,14] 消息:根元素后面的文档必须是格式良好的。

Here's a way you could do it:你可以这样做:

<?xml version="1.0" encoding="UTF-8"?>
 <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    version="1.0"
    xmlns:urn="urn:epaservice" 
    xmlns:por="http://PAS_1_1.ESB.OOO.com"
    exclude-result-prefixes="por">
     
  <xsl:output method="xml" omit-xml-declaration="yes" indent="yes"/>

  <xsl:template match="/">
    <xsl:apply-templates select="por:ReadMostRecentPrices/mostRecentPricesSet"/>
  </xsl:template>
  
  <xsl:template match="mostRecentPricesSet">
    <xsl:apply-templates select="securityDurableKeys"/>
    <urn:priceScheme xmlns:urn="urn:epaservice"><xsl:value-of select="priceScheme"/></urn:priceScheme>
    <urn:date xmlns:urn="urn:epaservice"><xsl:value-of select="date"/></urn:date>
  </xsl:template>
  
  <xsl:template match="securityDurableKeys">
    <urn:securityDurableKeys xmlns:urn="urn:epaservice">
      <xsl:apply-templates select="securityDurableKey"/>
    </urn:securityDurableKeys>
  </xsl:template>
  
  <xsl:template match="securityDurableKey">
    <urn:securityDurableKey><xsl:value-of select="."/></urn:securityDurableKey>
  </xsl:template>
  
</xsl:stylesheet>

See it working here: https://xsltfiddle.liberty-development.net/3MEcZxB看到它在这里工作: https : //xsltfiddle.liberty-development.net/3MEcZxB

It's much simpler if you can test your transformation on the same engine than the one you will be using on your server.如果您可以在与您将在服务器上使用的引擎相同的引擎上测试您的转换,那就简单多了。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM