gpt4 book ai didi

xslt - 如何更改根节点的属性值和命名空间 url

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

我想更改 xml 的命名空间 url 值。我有一个类似下面的 xml

<catalog xmlns="http://someurl"
xmlns:some="http://someurl2"
xsi:schemaLocation="http://someurl some.3.0.xsd"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<cd>
<title>Empire Burlesque</title>
<artist>Bob Dylan</artist>
<country>USA</country>
<company>
<name>Columbia</name>
</company>
<price>10.90</price>
<year>1985</year>
</cd>
</catalog>

我正在使用身份转换。有什么办法可以更改命名空间 ursl 中的文本吗?例如,我想将网址“http://someurl”更改为“http://someur2”和 'http://someurl some.3.0.xsd' 到 'http://someurl some.4.0.xsd'

最佳答案

应该这样做:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="1.0"
xmlns:old="http://someurl" exclude-result-prefixes="old">
<!-- Identity transform -->
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>

<!-- replace namespace of elements in old namespace -->
<xsl:template match="old:*">
<xsl:element name="{local-name()}" namespace="http://someurl2">
<xsl:apply-templates select="@* | node()"/>
</xsl:element>
</xsl:template>

<!-- replace xsi:schemaLocation attribute -->
<xsl:template match="@xsi:schemaLocation">
<xsl:attribute name="xsi:schemaLocation">http://someurl some.4.0.xsd</xsl:attribute>
</xsl:template>
</xsl:stylesheet>

对于样本输入,这给出:

<?xml version="1.0" encoding="utf-8"?>
<catalog xmlns="http://someurl2"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://someurl some.4.0.xsd">
<cd>
<title>Empire Burlesque</title>
<artist>Bob Dylan</artist>
<country>USA</country>
<company>
<name>Columbia</name>
</company>
<price>10.90</price>
<year>1985</year>
</cd>
</catalog>

解释:

添加到身份转换的最后两个模板更具体,因此比身份模板具有更高的默认优先级。它们分别覆盖“旧”命名空间中元素的身份模板和 xsl:schemaLocation 属性。

“old:*”的模板输出一个元素,该元素与它要替换的元素具有相同的本地名称(即不带 namespace 的名称),并为其提供新的所需 namespace 。

令人高兴的是,XSLT 处理器(或者更准确地说,序列化程序;我使用 Saxon 6.5.5 进行测试)决定将这个新命名空间设为默认命名空间,因此它为它添加了一个默认命名空间声明到输出根元素。我们并没有要求它这样做,从理论上讲,这个新命名空间是默认命名空间还是使用前缀并不重要。但您似乎希望它成为默认设置,这样效果很好。

关于xslt - 如何更改根节点的属性值和命名空间 url,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4399746/

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