java - 仅复制 WSO2 SOAP 信封中的内部元素并添加新命名空间
问题描述
你能帮我吗?
我正在尝试从 WSO2 SOAP 信封中提取核心元素并将其转发到另一个 SOAP 服务。
任何帮助表示赞赏,感谢阅读
BEFORE 显示我收到的输入消息,AFTER 显示我到目前为止的进度, DESIRED 是我想要的输出,而 FINAL OUTPUT 将 DESIRED 包含在一个名为request的元素中, 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>
约束或陷阱:
- 我正在使用 Windows PowerShell 和 System.Xml.Xsl.XslCompiledTransform 来测试我的转换,如果我在第一个模板匹配中使用 <xsl:template match="/">
- 生产系统使用 org.apache.synapse.mediators.transform.XSLTMediator,当我使用指令 <xsl:template match="/"> Apache XSLT 处理器失败,错误如下
- 看来我必须使用 <xsl:template match="@* | node()">
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
如果您可以在同一个引擎上测试您的转换而不是您将在您的服务器上使用的引擎,那么它会简单得多。
推荐阅读
- python - 从空单元格读取数据帧并启动数据初始化
- c - 创建一个循环,接收来自用户的 IP 和子网掩码输入,并将它们转换为 C 中的广播 IP
- javascript - window.open 从父级移除引用
- classification - Google AutoML Table 中的多输出分类
- excel - 如何调用存储在云盘上的模块
- jquery - 如何在响应式 CSS 菜单中添加多级?
- laravel - octobercms 中的电子邮件订阅表格
- mysql - 服务器重启后出现MySQL
- laravel - 如何在多态(laravel 6)中保存id和模型?
- flutter - Flutter 上用于位置设置的本机对话框