Xml xsl命名空间uri转换

Xml xsl命名空间uri转换,xml,xslt,Xml,Xslt,给定一个在名称空间中实现了版本控制方案的xml文档,我可以应用什么xslt来转换所有URI,将文档映射到新版本 我不知道文档将使用什么名称空间,也不知道引用在文档中是如何组织的 e、 g 到 在XSLT2和XSLT3中,可以使用xsl:namespace-so创建名称空间节点 应该给你一个想法,在它转变 <a:add xmlns:a="urn:_2018_1.a" xmlns:b="urn:_2018_1.b" xmlns:c="urn:_2018_1.c" &

给定一个在名称空间中实现了版本控制方案的xml文档,我可以应用什么xslt来转换所有URI,将文档映射到新版本

我不知道文档将使用什么名称空间,也不知道引用在文档中是如何组织的

e、 g


在XSLT2和XSLT3中,可以使用xsl:namespace-so创建名称空间节点

应该给你一个想法,在它转变

<a:add
    xmlns:a="urn:_2018_1.a" 
    xmlns:b="urn:_2018_1.b" 
    xmlns:c="urn:_2018_1.c"
>
</a:add>
进入


使用Saxon 9.8。

谢谢。XSLT2和XSLT3是唯一现实的选择吗?我在Java中工作,与其添加额外的依赖项,不如依赖于内置的内容。XSLT 1没有xsl:namespace元素来构建新的名称空间,这是XSLT 2或3的主要功能,需要它以通用和紧凑的方式工作。我不再习惯用XSLT 1的术语来思考问题,让我们等一下XSLT 1的爱好者会给你什么建议。如果你在Java中工作,那么使用XSLT的版本几乎没有什么借口,现在已经有将近20年的历史了。事实上,没有纯XSLT 1.0解决方案,但是有一种解决方案使用XSLT1.0加上节点集扩展。要在XSLT 1.0中动态创建名称空间,首先在该名称空间中构造一个元素节点,使用这种名称空间的人应该在黎明时分拍摄,但我想,如果每个人都正确地设计XML,XSLT就会变得多余。@MichaelKay总是需要将为一个目的正确设计的XML转换为为为另一个目的正确设计的XML。@Chomah你确定需要这样做吗?将节点从旧名称空间转换为新名称空间就足够了,并让XSLT处理器提供必要的名称空间声明。
<a:add
    xmlns:a="urn:_2019_1.a" 
    xmlns:b="urn:_2019_1.b" 
    xmlns:c="urn:_2019_1.c"
    ....
>
...
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    exclude-result-prefixes="xs"
    version="3.0">

<xsl:param name="old-ns-year" select="'2018'"/>
<xsl:param name="new-ns-year" select="'2019'"/>

<xsl:mode on-no-match="shallow-copy"/>

<xsl:template match="*">
    <xsl:element name="{name()}" namespace="{replace(namespace-uri(), $old-ns-year, $new-ns-year)}">
        <xsl:apply-templates select="namespace::*, @*, node()"/>
    </xsl:element>
</xsl:template> 

<xsl:template match="namespace::*">
    <xsl:namespace name="{name()}" select="replace(., $old-ns-year, $new-ns-year)"/>
</xsl:template>

<xsl:template match="@*">
    <xsl:attribute name="{name()}" namespace="{replace(namespace-uri(), $old-ns-year, $new-ns-year)}" select="."/>
</xsl:template>

</xsl:stylesheet>
<a:add
    xmlns:a="urn:_2018_1.a" 
    xmlns:b="urn:_2018_1.b" 
    xmlns:c="urn:_2018_1.c"
>
</a:add>
<a:add xmlns:a="urn:_2019_1.a" xmlns:b="urn:_2019_1.b" xmlns:c="urn:_2019_1.c">
</a:add>