xml - 选择一个节点下的所有节点并使用 XSLT 添加前缀
问题描述
我正在尝试编写 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>
任何帮助将不胜感激!:) 苏凯纳
解决方案
最短的形式是
<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>
推荐阅读
- docker - 如何在同一台机器上的多个操作系统之间共享 docker 映像
- r - na.locf - 不允许负长度向量
- xml - xslt 一次显示一组 n 个 xml 节点
- c# - Windows Server 2016 - 请求被中止:无法创建 SSL/TLS 安全通道
- angular - 如何在 Angular 7 中加载外部资源
- excel - 在不使用动态范围选项的情况下更改枢轴范围
- python - Python:如何在特定位置复制和插入 xml 元素
- mysql - 当事件循环等待数据库操作时,如何处理对 nodejs 服务器的传入请求
- php - 如何在 symfony / 学说中做多态关系?
- bash - 如何验证两个 unix 主机之间的端口连接?