Xml XSLT输出具有不同的名称空间,但名称空间前缀与输入相同

Xml XSLT输出具有不同的名称空间,但名称空间前缀与输入相同,xml,xslt,xml-namespaces,Xml,Xslt,Xml Namespaces,我想将一个根据模式(2)进行验证的XML实例转换为一个根据旧模式(1)进行验证的实例 这两个模式使用不同的名称空间URI,但这些URI共享相同的元素名称前缀 唯一的解决方法是在转换之前更改输入中使用的名称空间前缀吗?或者可以将其内置到XSLT中 唯一的解决方法是仅更改中使用的命名空间前缀 转换前输入 不,解决方案是在样式表中为源XML名称空间使用不同的前缀。下面是一个简单的例子: XML <abc:root xmlns:abc="www.example.com/source"/>

我想将一个根据模式(2)进行验证的XML实例转换为一个根据旧模式(1)进行验证的实例

这两个模式使用不同的名称空间URI,但这些URI共享相同的元素名称前缀

唯一的解决方法是在转换之前更改输入中使用的名称空间前缀吗?或者可以将其内置到XSLT中

唯一的解决方法是仅更改中使用的命名空间前缀 转换前输入

不,解决方案是在样式表中为源XML名称空间使用不同的前缀。下面是一个简单的例子:

XML

<abc:root xmlns:abc="www.example.com/source"/>

XSLT1.0

<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:src="www.example.com/source"
xmlns:abc="www.example.com/target"
exclude-result-prefixes="src"> 
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>

<xsl:template match="src:*">
    <xsl:element name="abc:{local-name()}">
        <xsl:apply-templates/>
    </xsl:element>
</xsl:template>

</xsl:stylesheet>  

结果

<?xml version="1.0" encoding="UTF-8"?>
<abc:root xmlns:abc="www.example.com/target"/>

唯一的解决方法是仅更改中使用的命名空间前缀 转换前输入

不,解决方案是在样式表中为源XML名称空间使用不同的前缀。下面是一个简单的例子:

XML

<abc:root xmlns:abc="www.example.com/source"/>

XSLT1.0

<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:src="www.example.com/source"
xmlns:abc="www.example.com/target"
exclude-result-prefixes="src"> 
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>

<xsl:template match="src:*">
    <xsl:element name="abc:{local-name()}">
        <xsl:apply-templates/>
    </xsl:element>
</xsl:template>

</xsl:stylesheet>  

结果

<?xml version="1.0" encoding="UTF-8"?>
<abc:root xmlns:abc="www.example.com/target"/>


schema不定义任何前缀,它们定义目标名称空间。是的,确实如此。我的假设是,只需分配一个工作前缀就可以在XSLT中使用,并期望它能够识别实例中找到的URI,而不管实例使用什么作为前缀?我需要转换的实例将使用在模式中定义为方便使用的前缀,以及(1)和(2)对两个不同的URI使用相同的前缀。您能否发布您尝试过的最小但完整的XML输入、XML输出和XSLT片段?正如您所说,您有一种输入格式要转换为第二种输出格式,我不知道您为什么会发现前缀有问题,您当然可以编写,例如,
模式不定义任何前缀,它们定义目标名称空间。是的,这是真的。我的假设是,只需分配一个工作前缀就可以在XSLT中使用,并期望它能够识别实例中找到的URI,而不管实例使用什么作为前缀?我需要转换的实例将使用在模式中定义为方便使用的前缀,以及(1)和(2)对两个不同的URI使用相同的前缀。您能否发布您尝试过的最小但完整的XML输入、XML输出和XSLT片段?正如您所说,您有一种输入格式要转换为第二种输出格式,我不确定您为什么会发现前缀有问题,您当然可以编写,例如,
这是我在发布后2分钟的工作假设。一旦我完成了基于此的XSLT,我将结束这个问题。这是我发布后2分钟的工作假设。一旦完成了基于此的XSLT,我将结束这个问题。