[英]Copy only the inner elements in a WSO2 SOAP envelope and add a new namespace
你能帮我吗?
我试图从 WSO2 SOAP 信封中提取核心元素并将其转发到另一个 SOAP 服务。
任何帮助表示赞赏,感谢阅读
BEFORE 显示我收到的输入消息,AFTER 显示我到目前为止取得的进展,DESIRED 是我想要的输出,FINAL OUTPUT 将把 DESIRED 包含在一个名为request的元素中,请求元素是静态的,所以它不需要在 XSLT 转换中,如果它简化了解决方案,可以从 XSLT 转换中排除。
前:
<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>
后:
<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>
期望:
<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>
最终输出
<?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>
这是我的 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>
限制或陷阱:
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] 原因: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] 消息:根元素后面的文档必须是格式良好的。
你可以这样做:
<?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>
看到它在这里工作: https : //xsltfiddle.liberty-development.net/3MEcZxB
如果您可以在与您将在服务器上使用的引擎相同的引擎上测试您的转换,那就简单多了。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.