由于某些原因,我需要更改现有的xml文件,我想使用xslt来做到这一点。我需要将一些名称空间声明从根节点移动到子节点。
基本上我从一个看起来像这样的文件开始:
<env:Envelope xmlns:env="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:ns1="http://ns1" xmlns:ns2="http://ns2" xmlns:ns3="http://ns3">
<env:Header>
<ns1:parent11>
<ns1:child11>value</ns1:child11>
<ns1:child11>value</ns1:child11>
<ns1:child11>value</ns1:child11>
<ns1:child12>
<ns2:child21>value</ns2:child21>
<ns2:child22>value</ns2:child22>
</ns1:child12>
</ns1:parent11>
</env:Header>
<env:Body>
<ns3:parent31>
<ns3:child31>value</ns3:child31>
<ns3:child32>value</ns3:child32>
<ns3:child33>
<ns2:parent2>
<ns2:child23>value</ns2:child23>
<ns2:child23>value</ns2:child23>
<ns2:child23>value</ns2:child23>
</ns2:parent2>
</ns3:child33>
</ns3:parent31>
</env:Body>
我需要以这样的结局结束:
<env:Envelope xmlns:env="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:ns1="http://ns1" xmlns:ns2="http://ns2" xmlns:ns3="http://ns3">
<env:Header>
<parent11 xmlns="http://ns1">
<child11>value</child11>
<child11>value</child11>
<child11>value</child11>
<child12>
<ns2:child21>value</ns2:child21>
<ns2:child22>value</ns2:child22>
</child12>
</parent11>
</env:Header>
<env:Body>
<parent31 xmlns="http://ns3">
<child31>value</child31>
<child32>value</child32>
<child33>
<parent2 xmlns="http://ns2">
<child23>value</child23>
<child23>value</child23>
<child23>value</child23>
</parent2>
</child33>
</parent31>
</env:Body>
我是xslt中的一个完全新手(我选择它是因为我认为这是正确的方法),所以我一开始就陷入困境,我甚至不知道如何开始。
答案 0 :(得分:0)
解决方案XSLT 1.0 / XSLT 2.0:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:env="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:ns1="http://ns1"
xmlns:ns2="http://ns2"
xmlns:ns3="http://ns3"
version="1.0">
<xsl:template match="ns1:* | ns2:* | ns3:*">
<xsl:element name="{local-name()}" namespace="{namespace-uri()}">
<xsl:apply-templates/>
</xsl:element>
</xsl:template>
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
<强>输出:强>
<?xml version="1.0" encoding="UTF-8"?>
<env:Envelope xmlns:env="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://ns1"
xmlns:ns2="http://ns2" xmlns:ns3="http://ns3">
<env:Header>
<parent11 xmlns="http://ns1">
<child11>value</child11>
<child11>value</child11>
<child11>value</child11>
<child12>
<child21 xmlns="http://ns2">value</child21>
<child22 xmlns="http://ns2">value</child22>
</child12>
</parent11>
</env:Header>
<env:Body>
<parent31 xmlns="http://ns3">
<child31>value</child31>
<child32>value</child32>
<child33>
<parent2 xmlns="http://ns2">
<child23>value</child23>
<child23>value</child23>
<child23>value</child23>
</parent2>
</child33>
</parent31>
</env:Body>
</env:Envelope>
说明强>
上层模板删除名称空间前缀 - 例如ns1
- 匹配的元素。
第二个模板是所有其他元素,属性和文本的标识副本。
XSLT-Processors自己删除同一名称空间中的子名称空间。