在 XSLT 样式表中声明多个 EXSLT 扩展的正确方法

Proper way to declare more than one EXSLT extension in an XSLT stylesheet

在单个 XSLT 样式表中声明多个 EXSLT 扩展的正确方法是什么?

更重要的是 xmlns:*="http://exslt.org/*" 的目的是什么?

documentation 说:

You can use the extension-element-prefixes attribute to prevent the extension namespaces from being output in the result tree.

难道只是为了不在输出文档的根节点显示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输出

<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">

And more importantly what is the purpose of xmlns:*="http://exslt.org/*"?

这是一个将前缀绑定到命名空间 URI 的命名空间声明。前缀可以是您想要的任何内容 - 它是告诉处理器该元素位于属于受支持扩展的命名空间中的命名空间 URI。

这与防止声明出现在输出中无关。这是通过使用 extension-element-prefixesexclude-result-prefixes 属性来实现的。为什么这很重要?如果名称空间声明不是目标架构的一部分,这可能很重要。