如何为我的 XSLT XPath 定义默认命名空间? (XSLT 2.0)

How can I define a default namespace for my XSLT XPaths? (XSLT 2.0)

我有 XML 想要用 XSL 转换以在浏览器中查看。

我已经在 XML http://www.tei-c.org/ns/1.0 中创建了默认命名空间。为了避免在 XML 和 XSL 中使用前缀,我将 xpath-default-namespace="http://www.tei-c.org/ns/1.0" 添加到我的 xsl:stylesheet 元素中。然而,我的 xpath 似乎仍然需要前缀,因为没有前缀的 xpath 不起作用。

我错过了什么? xpath-default-namespace 属性不应该确保我可以在我的 xpath 中使用默认命名空间,从而避免需要在(默认)命名空间前添加前缀吗?

我在自己的 Web 服务器(Debian Bullseye、Apache、Raspberry Pi)上托管 XML 和 XSL。我安装的软件包可能有问题吗?例如,我安装了 libxslt1.1,它只“支持”XSLT 1.0(不包括 xpath-default-namespace 属性)。但是 XML 不应该由浏览器转换,而不是由我的服务器转换吗?

XML

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="mezzo.xsl" version="2.0"?>

<TEI xmlns="http://www.tei-c.org/ns/1.0">
        <teiHeader>
                <fileDesc>
                        <titleStmt>Canto 1 of Inferno</titleStmt>
                </fileDesc>
        </teiHeader>
        <text>
        ...
        </text>
</TEI>

XSL

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xpath-default-namespace="http://www.tei-c.org/ns/1.0">

<xsl:template match="/">
        <html>
                <body>
                        <h1>mezzo</h1>
                        <p>
                                <strong>Title Statement: </strong>
                        <xsl:value-of select="//titleStmt"/>
                        </p>
                </body>
        </html>
</xsl:template>

</xsl:stylesheet>

XSLT 定义了一种“向前兼容模式”,这意味着如果您将指定版本 =“2.0”的样式表提交给仅支持 1.0 的 XSLT 处理器,处理器将忽略它不理解的元素和属性,在这种情况下 xpath-default-namespace.

(这是否是一个好的设计决策仍然是一个悬而未决的问题。在这种特殊情况下,新属性完全改变了代码的含义,因此错误消息会更好。但是 1.0 处理器不知道那,当然。)