xml - 将 xmlns 添加到根元素保留现有的命名空间
问题描述
我有以下 XML:
<RootNode xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:cac="http://b/2" xmlns:cbc="http://a/2" xmlns:ns0="SomeNamespace" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<cbc:Element1>0000000001234567</cbc:Element1>
<cbc:Element2>xxxxx</cbc:Element1>
<cac:Element3>
<cac:Element4>
<cac:Element5>
<cbc:Element6 schemeID="AAA">1234567890123</cbc:Element6>
</cac:Element5>
</cac:Element4>
</cac:Element3>
</RootNode>
我想将 xmlns 属性添加到保留所有其他名称空间的根节点。我有一个 XSLT 来添加命名空间,但它删除了所有命名空间并只添加了 xmlns。
使用此 XSLT:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="no" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:variable name="vDefaultNS" select="'addedNamespace"/>
<!-- Extra -->
<xsl:template match="*">
<xsl:element name="{local-name()}" namespace="{$vDefaultNS}">
<xsl:copy-of select="@*"/>
<xsl:apply-templates/>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
我得到:
<?xml version="1.0" encoding="UTF-8"?>
<RootNode xmlns="addedNamespace">
<cbc:Element1>0000000001234567</cbc:Element1>
<cbc:Element2>xxxxx</cbc:Element1>
<cac:Element3>
<cac:Element4>
<cac:Element5>
<cbc:Element6 schemeID="AAA">1234567890123</cbc:Element6>
</cac:Element5>
</cac:Element4>
</cac:Element3>
</RootNode>
但我想要:
<?xml version="1.0" encoding="UTF-8"?>
<RootNode xmlns="addedNamespace" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:cac="http://b/2" xmlns:cbc="http://a/2" xmlns:ns0="SomeNamespace" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<cbc:Element1>0000000001234567</cbc:Element1>
<cbc:Element2>xxxxx</cbc:Element1>
<cac:Element3>
<cac:Element4>
<cac:Element5>
<cbc:Element6 schemeID="AAA">1234567890123</cbc:Element6>
</cac:Element5>
</cac:Element4>
</cac:Element3>
</RootNode>
解决方案
我想向根节点添加一个 xmlns 属性
实际上,您想将根元素移动到另一个命名空间。尝试:
XSLT 1.0
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>
<!-- identity transform -->
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="/RootNode">
<RootElement xmlns="addedNamespace">
<xsl:copy-of select="namespace::*"/>
<xsl:apply-templates select="@*|node()"/>
</RootElement>
</xsl:template>
</xsl:stylesheet>
推荐阅读
- javascript - 未捕获的类型错误:grid.imagesLoaded 不是函数
- python - 连接多个numpy数组的有效方法
- python-3.x - 在 SKLearn 中使用自定义转换器时的 SettingWithCopyWarning
- flutter - 在应用浏览器中隐藏功能不起作用?
- android - 进度条的自定义框架
- c - 是否有一些 C 预处理器可以提高将“this”传递给虚拟方法的要求?
- mysql - 将不同树中的两个表加入 phpmyadmin
- java - 我可以订阅 Java 中的 SseEmitter
- stormcrawler - 下载 StormCrawler 中的所有图像而不对其进行索引
- c++ - 带有 std::atomic_flag 的自旋锁 - 是否让线程进入睡眠状态?