问题描述
我正在尝试编写一个 XSLT 代码来向 mes:caseInfos 的所有节点(子节点和兄弟节点)添加 sob 前缀命名空间
我想为 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>
任何帮助将不胜感激! :) 苏凯娜
解决方法
最短的形式
<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>