我意识到命名空间问题比比皆是,但我是从 Saxon 那里得到的:
Warning SXXP0005: The source document is in namespace http://docbook.org/ns/docbook, b ut all the template rules match elements in no namespace (Use --suppressXsltNamespaceChec k:on to
avoid this warning)
我的源文件的根元素是:
<?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 文件中具有相同的默认 namespace 可以防止此类错误。
另外,我想我可以声明一个前缀并将其应用于所有元素。但是避免前缀不就是默认命名空间的全部意义吗?
最佳答案
您可以在 xsl:stylesheet
上使用(XSLT 2 及更高版本)xpath-default-namespace="http://docbook.org/ns/docbook"
如果您希望模式和表达式(例如 procedure
)匹配/选择该命名空间中的元素。否则,procedure
匹配/选择没有命名空间中该名称的元素。
样式表中的 xmlns="http://docbook.org/ns/docbook"
仅用于放置结果元素(例如示例中的 orderedlist
) 进入该命名空间。
关于xml - "Template rules match elements in no namespace"消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46791990/