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

Posted

技术标签:

【中文标题】“模板规则匹配无命名空间中的元素”消息【英文标题】:"Template rules match elements in no namespace" message 【发布时间】:2018-03-29 06:05:57 【问题描述】:

我意识到命名空间问题是一毛钱,但我是从撒克逊人那里得到的:

警告 SXXP0005:源文档在命名空间中 http://docbook.org/ns/docbook,但是所有模板规则都匹配 没有命名空间中的元素(使用 --suppressXsltNamespaceCheck: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】:

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

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

【讨论】:

以上是关于“模板规则匹配无命名空间中的元素”消息的主要内容,如果未能解决你的问题,请参考以下文章

使用命名空间的 SOAP 消息

使用 RMQ 在 Symfony Messenger 中处理来自不同命名空间的消息

socket.io - 如何在命名空间上广播消息?

WCF - 反序列化时控制命名空间

我遇到了 ehcache 问题,我收到错误消息“无法找到 XML 模式命名空间的 Spring NamespaceHandler [http://www.ehcache.org/v3]”

Pulsar 消息概念2