XPath 中引用的源文件中的 XSLT 命名空间

XSLT namespace in source file referencing in XPath

我花了几个小时解决我的问题,直到我意识到 XSL 文件中的 XPath 与我的源文档不匹配,只要在 XML:

中定义了一个命名空间
<?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?>
<?xml-stylesheet type="text/xsl" href="../../../clonk.xsl"?>
<clonkDoc xmlns="https://clonkspot.org"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="https://clonkspot.org ../../../clonk.xsd">
    <func>
        <some-more-elements/>
    </func>
    <author>Author</author><date>lazy date</date>
</clonkDoc>

据我所知需要 xmlns="https://clonkspot.org" 可以用 XSD.

引用文档

我的 XSL 文件如下所示(此处未显示“head”和“nav”):

<?xml version="1.0" encoding="ISO-8859-1"?>

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0" xmlns:clonk="https://clonkspot.org">

    <xsl:output method="html" encoding="ISO-8859-1" doctype-public="-//W3C//DTD HTML 4.01//EN"
                doctype-system="http://www.w3.org/TR/html4/strict.dtd"/>
    <xsl:template match="/clonk:clonkDoc/clonk:func">
        <html>
            <xsl:call-template name="head"/>
            <body>
                <xsl:call-template name="nav"/>
                <h1>
                </h1>
        </body>
    </html>
</xsl:template>

结果如下:

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">

    <html xmlns:clonk="https://clonkspot.org">
    <head>...
    </head>
    <body>
        <h1></h1>
    </body>
</html>
    Authorlazy date

我有两个问题:

  1. 我在目标 html 文档中没有“clonk:”元素,但在 <html> 元素中定义了命名空间。
  2. 我想在 XSL 的所有 XPath 中保存“clonk:”。

如何告诉 XSLT 处理器将 <template match="/clonkDoc/func"> 解释为源 XML 文档的默认名称空间(其中 xmlns="https://clonkspot.org")?

非常感谢!

要从输出中排除 xmlns:clonk="https://clonkspot.org" 声明,请将其添加到 xsl:stylesheet start-tag。

exclude-result-prefixes="clonk"

我不明白你的第二个问题。如果您询问如何定义一个默认名称空间,该名称空间将用于样式表中任何 XPath 表达式中包含的任何无前缀元素名称,那么答案是您需要 XSLT 2.0: https://www.w3.org/TR/xslt20/#unprefixed-qnames