“模板规则匹配无命名空间中的元素”消息
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
)放入该命名空间。
【讨论】:
以上是关于“模板规则匹配无命名空间中的元素”消息的主要内容,如果未能解决你的问题,请参考以下文章
使用 RMQ 在 Symfony Messenger 中处理来自不同命名空间的消息
我遇到了 ehcache 问题,我收到错误消息“无法找到 XML 模式命名空间的 Spring NamespaceHandler [http://www.ehcache.org/v3]”