gpt4 book ai didi

xml - 如何使用 XSLT 从 XML 中删除 namespace

转载 作者:数据小太阳 更新时间:2023-10-29 01:38:51 25 4
gpt4 key购买 nike

我有一个 150 MB(有时甚至更大)的 XML 文件。我需要删除所有 namespace 。它基于 Visual Basic 6.0,因此我使用 DOM 加载 XML。加载没问题,一开始我很怀疑,但不知何故那部分工作正常。

我正在尝试以下 XSLT , 但它也删除了所有其他属性。我想保留所有的属性和元素,我只需要删除命名空间。显然是因为我有 xsl:element 但没有属性。如何在其中包含属性?

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" omit-xml-declaration="yes" version="1.0" encoding="UTF-8" />
<xsl:template match="*">
<xsl:element name="{local-name()}">
<xsl:apply-templates select="@* | node()"/>
</xsl:element>
</xsl:template>
</xsl:stylesheet>

最佳答案

您的 XSLT 也删除了属性,因为您没有可以复制它们的模板。 <xsl:template match="*">仅匹配元素,不匹配属性(或文本、注释或处理指令)。

下面是一个样式表,它从处理过的文档中删除了所有命名空间定义,但复制了所有其他节点和值:元素、属性、注释、文本和处理指令。请注意2件事

  1. 照这样复制属性不足以删除所有命名空间。属性也可以属于命名空间,即使包含元素不属于命名空间。因此也需要创建属性,如元素。创建属性是用 <xsl:attribute> 完成的元素。
  2. 一个有效的 XML 文档不能包含一个元素,该元素具有两个或多个具有相同扩展名称的属性,但元素可以包含多个具有相同本地名称的属性如果这些属性具有不同的命名空间。这意味着删除如果有一个元素至少有两个具有相同本地名称的属性,则来自属性名称的命名空间前缀将导致数据丢失。这些属性中的其他一个将被删除(或覆盖)。

...和代码:

<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:output indent="yes" method="xml" encoding="utf-8" omit-xml-declaration="yes"/>

<!-- Stylesheet to remove all namespaces from a document -->
<!-- NOTE: this will lead to attribute name clash, if an element contains
two attributes with same local name but different namespace prefix -->
<!-- Nodes that cannot have a namespace are copied as such -->

<!-- template to copy elements -->
<xsl:template match="*">
<xsl:element name="{local-name()}">
<xsl:apply-templates select="@* | node()"/>
</xsl:element>
</xsl:template>

<!-- template to copy attributes -->
<xsl:template match="@*">
<xsl:attribute name="{local-name()}">
<xsl:value-of select="."/>
</xsl:attribute>
</xsl:template>

<!-- template to copy the rest of the nodes -->
<xsl:template match="comment() | text() | processing-instruction()">
<xsl:copy/>
</xsl:template>

</xsl:stylesheet>

你也可以使用 <xsl:template match="node()">而不是最后一个模板,但你应该使用 priority属性以防止元素与此模板匹配。

关于xml - 如何使用 XSLT 从 XML 中删除 namespace ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5268182/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com