“模板规则匹配无命名空间中的元素”消息

时间:2017-10-17 13:58:12

标签: xml xslt namespaces

我意识到命名空间问题只有十几个,但我来自Saxon:

  

警告SXXP0005:源文档位于命名空间中   http://docbook.org/ns/docbook,所有模板规则都匹配   没有命名空间中的元素(使用--suppressXsltNamespaceChec k:on到
  避免这个警告)

我的源文件的根元素是:

    <?xml version="1.0" encoding="UTF-8"?>
    <topic xmlns:xi="http://www.w3.org/2001/XInclude" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns="http://docbook.org/ns/docbook" 
    xml:id="103829">
    <info>
        <title>My title</title>
    </info>
    <procedure>
...

我的XSL是:

<?xml version="1.0"?>
<xsl:stylesheet version="2.0" 
    xmlns:xi="http://www.w3.org/2001/XInclude"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns="http://docbook.org/ns/docbook">

<!-- Dummy template, just trying to match anything -->      
    <xsl:template match="procedure">
        <orderedlist>
            SOME TEXT
            <xsl:copy-of select="*"/>
        </orderedlist>
    </xsl:template>

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

警告,模板不匹配。但我不知道为什么:我认为在源文件和XSL文件中使用相同的默认命名空间可以防止出现这种错误。

另外,我想我可以声明一个前缀并将其应用于所有元素。但是没有避免使用前缀作为默认命名空间的整个点吗?

1 个答案:

答案 0 :(得分:1)

如果您希望类似xpath-default-namespace="http://docbook.org/ns/docbook"的模式和表达式匹配/选择该命名空间中的元素,则可以在xsl:stylesheet上使用({XSLT 2及更高版本)procedure。否则procedure匹配/选择无名称空间中该名称的元素。

样式表中的xmlns="http://docbook.org/ns/docbook"仅用于将结果元素(如示例中的orderedlist)放入该命名空间。