如何为我的 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 处理器不知道那,当然。)
我有 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 处理器不知道那,当然。)