选择一个节点下的所有节点并使用XSLT添加前缀



我正在尝试编写一个XSLT代码,为mes:caseInfos的所有节点(子节点和兄弟节点)添加一个前缀名称空间

我想给mes: caseinfo的所有子元素添加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>

任何帮助都将非常感激!:(Soukaina

最短的形式是

<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:sob="namespace/type/servicename/types/mes"
version="1.0">
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="mes:caseInfos//*" xmlns:mes="namespace/service/servicename/messages/v1">
<xsl:element name="sob:{local-name()}">
<xsl:apply-templates select="@* | node()"/>
</xsl:element>
</xsl:template>
</xsl:stylesheet>

最新更新