单个 XSLT 样式表中声明多个 EXSLT 扩展的正确方法是什么?
更重要的是,xmlns:*="http://exslt.org/*"
的目的是什么?
文档说:
可以使用扩展元素前缀属性来防止在结果树中输出扩展命名空间。
只是为了不让xmlns:date="http://exslt.org/dates-and-times
显示在输出文档的根节点中吗? 如果是这样,为什么它很重要?
使用以下样式表,我得到错误:
lxml.etree.XMLSyntaxError: Attribute extension-element-prefixes redefined, line 7, column 40
我正在使用带有 lxml 处理器的 XSLT 1.0。
XML 输入
<?xml version='1.0'?>
<?xml-stylesheet type="text/xsl" href="stylesheet.xsl" version="1.0"?>
<item>test</item>
XSLT 1.0 样式表
<xsl:stylesheet
version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:str="http://exslt.org/strings"
xmlns:date="http://exslt.org/dates-and-times"
extension-element-prefixes="str"
extension-element-prefixes="date">
<xsl:template match="/">
<html>
<body>
<xsl:value-of
select="str:padding(2 - string-length(date:month-in-year()), 0)"/>
<xsl:value-of select="date:month-in-year()"/>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
网页输出
<html xmlns:str="http://exslt.org/strings" xmlns:date="http://exslt.org/dates-and-times">
<body>05</body>
</html>
您需要使用声明的命名空间前缀的空格分隔列表填充 xsl:extension-element-prefixes
属性。 在您的示例中,这将是:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:str="http://exslt.org/strings"
xmlns:date="http://exslt.org/dates-and-times"
extension-element-prefixes="str date">
更重要的是,的目的是什么
xmlns:*="http://exslt.org/*"
?
它是将前缀绑定到命名空间 URI 的命名空间声明。前缀可以是您想要的任何内容 - 它是命名空间 URI,它告诉处理器该元素位于属于受支持扩展的命名空间中。
这与阻止声明出现在输出中无关。这是通过使用 extension-element-prefixes
或 exclude-result-prefixes
属性来实现的。为什么这很重要?如果命名空间声明不是目标架构的一部分,则可能很重要。