gpt4 book ai didi

xml - 改变元素的命名空间

转载 作者:行者123 更新时间:2023-12-04 16:54:54 25 4
gpt4 key购买 nike

我有一个 xml 文档和一个现有的 xslt 转换(这两个都是相对较大的预先存在的代码)。

在 XML 的各个地方,我都声明了可空字段,如下所示:

<author i:nil="true" xmlns:i="http://www.w3.org/2001/XMLSchema-instance"/>

但是,我也已经在 xml 元素中声明了这个命名空间,如下所示:
<message xmlns="http://www.mynamespace.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

我曾要求任何 nil 节点的输出应如下所示:
<author xsi:nil="true" />

即 i:nil 应该变成 xsi:nil 并且元素上声明的命名空间被删除。

理想情况下,我想修改现有的转换以将其应用于 XML 中需要这样做的任何节点,但是我在措辞搜索以获取有关如何完成的任何结果方面遇到了一些困难。如果有人可以提供帮助,那将不胜感激。

(我无法使用任何 xslt 2.0 智能,以防万一会影响答案)。

稍大的样本输入:
<message xmlns="http://www.mynamespace.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<paper>
<name>A name</name>
<author i:nil="true" xmlns:i="http://www.w3.org/2001/XMLSchema-instance" />
</paper>
<paper>
<name>Another name</name>
<author>
Peter
</author>
<details>
<publishDate i:nil="true" xmlns:i="http://www.w3.org/2001/XMLSchema-instance" />
<location>London</location>
</details>
</paper>
</message>

和所需的输出:
<message xmlns="http://www.mynamespace.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<paper>
<name>A name</name>
<author xsi:nil="true" />
</paper>
<paper>
<name>Another name</name>
<author>
Peter
</author>
<details>
<publishDate xsi:nil="true" />
<location>London</location>
</details>
</paper>
</message>

最佳答案

编写身份转换和两个单独的模板来处理

  • 前缀为 i 的属性
  • 具有前缀为 i 的属性的元素.

  • 样式表
    <xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:i="http://www.w3.org/2001/XMLSchema-instance">

    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
    <xsl:strip-space elements="*"/>

    <xsl:template match="@*|node()">
    <xsl:copy>
    <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
    </xsl:template>

    <xsl:template match="attribute::i:*">
    <xsl:attribute name="{concat('xsi:',local-name())}">
    <xsl:value-of select="."/>
    </xsl:attribute>
    </xsl:template>

    <xsl:template match="*[attribute::i:*]">
    <xsl:element name="{local-name()}" namespace="http://www.mynamespace.com">
    <xsl:apply-templates select="@*|node()"/>
    </xsl:element>
    </xsl:template>

    </xsl:stylesheet>

    输出

    可空性属性现在以 xsi: 为前缀并且 Schema 实例命名空间仅在根元素上声明。
    <?xml version="1.0" encoding="UTF-8"?>
    <message xmlns="http://www.mynamespace.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <paper>
    <name>A name</name>
    <author xsi:nil="true"/>
    </paper>
    <paper>
    <name>Another name</name>
    <author>
    Peter
    </author>
    <details>
    <publishDate xsi:nil="true"/>
    <location>London</location>
    </details>
    </paper>
    </message>

    关于xml - 改变元素的命名空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22404416/

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