覆盖xmlns会破坏xslt结果

覆盖xmlns会破坏xslt结果,xml,xslt,notepad++,xslt-1.0,Xml,Xslt,Notepad++,Xslt 1.0,问题如下,我有一个简单的XML文件: <table xmlns="http://www.w3.org/TR/html4/"> <tr> <td> Does not work </td> </tr> </table> 和一个XSL转换文件 <xsl:transform version="1.0" xmlns="http://www.w3.org/T

问题如下,我有一个简单的XML文件:

<table xmlns="http://www.w3.org/TR/html4/">
    <tr>
        <td>
            Does not work
        </td>
    </tr>
</table>
和一个XSL转换文件

<xsl:transform version="1.0" xmlns="http://www.w3.org/TR/html4/" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:template match="td">
        It works
    </xsl:template>
</xsl:transform>
如果td匹配,我希望看到它作为模板定义的输出工作。 如果td不匹配,那么我希望看到它不起作用,因为默认模板将输出所有未由自定义模板处理的节点值。 结果:

但是,如果我将名称空间声明更改为xmlns:html=。。。然后结果就变了

xml:

xslt:

结果:

<?xml version="1.0"?>


    It works
这是一个隔离问题的简单示例,实际应用程序的xml由第三方软件提供,将xmlns声明覆盖到xmlns:不是一个选项。我的问题是,如何让它工作,结果是:它工作,而不改变xmlns

对于转换,我使用notepad++和XML工具插件,其中有一个XSL转换选项

先谢谢你

我的问题是,我如何让它工作,结果:它工作了,没有 更改xmlns

我的问题是,我如何让它工作,结果:它工作了,没有 更改xmlns


将第一个文档转换为具有默认命名空间的文档:

<table xmlns="http://www.w3.org/TR/html4/">
    <tr>
        <td>
            Does not work
        </td>
    </tr>
</table>
是处理具有默认名称空间的XML输入文档的常用方法。如果在样式表中有这样一个声明,html:td的意思将与输入文档中带有默认名称空间的td元素完全相同

这是因为前缀实际上是不相关的。像html这样的前缀:没有任何意义,有意义的是名称空间URI。前缀只是一种简写,以避免为每个元素键入或读取名称空间URI。你应该考虑一个元素,比如

<table xmlns="http://www.w3.org/TR/html4/">
您实际上可以看到默认名称空间的作用,因为结果将是:

<?xml version="1.0" encoding="UTF-8"?>
<result xmlns="http://www.w3.org/TR/html4/">it works</result>

将第一个文档转换为具有默认命名空间的文档:

<table xmlns="http://www.w3.org/TR/html4/">
    <tr>
        <td>
            Does not work
        </td>
    </tr>
</table>
是处理具有默认名称空间的XML输入文档的常用方法。如果在样式表中有这样一个声明,html:td的意思将与输入文档中带有默认名称空间的td元素完全相同

这是因为前缀实际上是不相关的。像html这样的前缀:没有任何意义,有意义的是名称空间URI。前缀只是一种简写,以避免为每个元素键入或读取名称空间URI。你应该考虑一个元素,比如

<table xmlns="http://www.w3.org/TR/html4/">
您实际上可以看到默认名称空间的作用,因为结果将是:

<?xml version="1.0" encoding="UTF-8"?>
<result xmlns="http://www.w3.org/TR/html4/">it works</result>

这是一个正确的答案,接受了Mathias Müller的答案以获取更多信息。感谢您接受了Mathias Müller的回答,以获取更多信息。你应该这么做!这是一个正确的答案,接受了Mathias Müller的答案以获取更多信息。感谢您接受了Mathias Müller的回答,以获取更多信息。你应该这么做!这就解决了问题,但我仍然不明白为什么不加前缀是行不通的。如果没有前缀,它是否默认为xmlns声明的命名空间,因为它与另一个命名空间没有冲突,我希望它可以工作。@DemanB如果没有前缀,它是否默认为xmlns声明的命名空间,如果没有前缀,然后它将选择没有名称空间的元素。@DemanB请让我再次解释一下:您的假设是,在xsl:template元素中,xsl:transform元素中声明的默认名称空间将应用于select属性的值。但是默认名称空间只应用于XML元素,从不应用于属性,也从不应用于属性的值。有一些功能可以做到这一点,但我不建议在这种情况下使用:。此外,它还需要XSLT 2.0。@Mathias Müller谢谢,你上次的评论解释了这一切,现在XSLT样式表只是一个普通的XML文件,我很清楚。这解决了问题,但我仍然不明白为什么不在它前面加前缀是行不通的。如果没有前缀,它是否默认为xmlns声明的命名空间,因为它与另一个命名空间没有冲突,我希望它可以工作。@DemanB如果没有前缀,它是否默认为xmlns声明的命名空间,如果没有前缀,然后它将选择没有名称空间的元素。@DemanB请让我再次解释一下:您的假设是,在xsl:template元素中,xsl:transform元素中声明的默认名称空间将应用于select属性的值。但是默认名称空间只应用于XML元素,从不应用于属性,也从不应用于属性的值。有一些功能可以做到这一点,但我不建议在这种情况下使用:。另外,它还需要XSLT2.0。@Mathias Müller谢谢你,你上次的评论解释了这一切,现在XSLT样式表只是一个普通的XML文件,我很清楚了。
<?xml version="1.0" encoding="UTF-8"?>


    It works
xmlns:html="http://www.w3.org/TR/html4/"
<table xmlns="http://www.w3.org/TR/html4/">
<{http://www.w3.org/TR/html4/}table>
<html:table xmlns:html="http://www.w3.org/TR/html4/">
<{http://www.w3.org/TR/html4/}table>
<xsl:transform version="1.0" xmlns="http://www.w3.org/TR/html4/">
<?xml version="1.0" encoding="UTF-8" ?>
<xsl:transform version="1.0" xmlns="http://www.w3.org/TR/html4/"  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:template match="/">
        <result>it works</result>
    </xsl:template>
</xsl:transform>
<?xml version="1.0" encoding="UTF-8"?>
<result xmlns="http://www.w3.org/TR/html4/">it works</result>