【发布时间】:2021-01-28 09:50:17
【问题描述】:
我正在尝试编写一个 XSLT 代码来将 sob 前缀命名空间添加到 mes:caseInfos 的所有节点(子节点和兄弟节点)
我想为 mes:caseInfos 的所有子元素添加 sob 前缀,如下所示
<soapenv:Envelope
xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:mes="namespace/service/servicename/messages/v1"
xmlns:cme="namespace/type/common/messages/v1"
xmlns:sob="namespace/type/servicename/types/mes"
xmlns:exc="namespace/type/common/exceptions/v1">
<soapenv:Body>
<mes:getCaseInfosResponse>
<mes:messageContext>
<cme:timestamp>2021-01-27T15</cme:timestamp>
</mes:messageContext>
<mes:responses>
<mes:response>
<mes:caseInfos>
<instance>
<instanceId>AC_WSPmockedInstanceId</instanceId>
</instance>
<case>
<id>AC_WSPmockedId</id>
<caseTexts>
<type>AC_WSPmockedType1</type>
</caseTexts>
<caseTexts>
<type>AC_WSPmockedType2</type>
</caseTexts>
<decision>
<code>AC_WSPmockedCode</code>
<labelFr>AC_WSPmockedLabelFr</labelFr>
</decision>
<extracts>
<extractFrStatus>AC_WSPmockedExtractFrStatus</extractFrStatus>
</extracts>
</case>
</mes:caseInfos>
</mes:response>
</mes:responses>
</mes:getCaseInfosResponse>
</soapenv:Body>
</soapenv:Envelope>
我想出了这个 XSLT,我尝试了这个(以及许多其他更改 XPath..)
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:mes="namespace/service/servicename/messages/v1"
xmlns:cme="namespace/type/common/messages/v1" xmlns:sob="namespace/type/servicename/types/v1"
version="1.0">
<xsl:output omit-xml-declaration="yes" />
<!-- Copies all the nodes as is -->
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()" />
</xsl:copy>
</xsl:template>
<!-- Select the element need to be apply the prefix -->
<xsl:template match="//mes:response/descendant-or-self::caseInfos">
<!--Define the namespace with prefix ns0 -->
<xsl:element name="sob:{name()}" >
<!--apply to above selected node -->
<xsl:apply-templates select="node()|@*">
</xsl:apply-templates>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
预期的转变
<soapenv:Envelope
xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:mes="namespace/service/servicename/messages/v1"
xmlns:cme="namespace/type/common/messages/v1"
xmlns:sob="namespace/type/servicename/types/mes"
xmlns:exc="namespace/type/common/exceptions/v1">
<soapenv:Body>
<mes:getCaseInfosResponse>
<mes:messageContext>
<cme:messageId >4c22aa14-e54f-413a-93f5-26b96434d22e</cme:messageId>
</mes:messageContext>
<mes:responses>
<mes:response>
<mes:caseInfos>
<sob:instance>
<sob:instanceId>AC_WSPmockedInstanceId</sob:instanceId>
</instance>
<sob:case>
<sob:id>AC_WSPmockedId</sob:id>
<sob:caseTexts>
<sob:type>AC_WSPmockedType1</sob:type>
</sob:caseTexts>
<sob:caseTexts>
<sob:type>AC_WSPmockedType2</sob:type>
</sob:caseTexts>
<sob:decision>
<sob:code>AC_WSPmockedCode</sob:code>
</sob:decision>
<sob:extracts>
<sob:extractFrStatus>AC_WSPmockedExtractFrStatus</sob:extractFrStatus>
</sob:extracts>
</case>
</mes:caseInfos>
</mes:response>
</mes:responses>
</mes:getCaseInfosResponse>
</soapenv:Body>
</soapenv:Envelope>
任何帮助将不胜感激! :) 苏凯纳
【问题讨论】:
-
您的输入样本甚至不是命名空间格式良好的 XML,请显示任何相关的命名空间声明,如果 XML 中使用了前缀,则需要存在相应的命名空间声明。并为输入样本显示想要的结果样本。
-
您好 Martin,感谢您的回复,我添加了预期结果(命名空间不是公共的)
-
请模拟任何命名空间声明,例如
xmlns:sob="http://example.com/sob",但我们需要看看你想要他们在哪里 -
我想添加前缀,因为我添加了预期的转换而不是命名空间,你能看看我添加了什么吗?谢谢
-
正如我所说,没有命名空间声明的
sob:instance不是命名空间格式良好的 XML,因此无法使用 XSLT 生成,您需要为使用的前缀显示任何命名空间声明。