XSLT 命名空间声明中的 exclude-result-prefixes 和 extension-element-prefix 有啥区别?

Posted

技术标签:

【中文标题】XSLT 命名空间声明中的 exclude-result-prefixes 和 extension-element-prefix 有啥区别?【英文标题】:What is the difference between exclude-result-prefixes and extension-element-prefix in XSLT namespace declaration?XSLT 命名空间声明中的 exclude-result-prefixes 和 extension-element-prefix 有什么区别? 【发布时间】:2011-10-04 10:04:01 【问题描述】:

exclude-result-prefixesextension-element-prefix 有什么区别?两者都用在 XSLT 的标头中。我在使用 EXSLT 时发现了extension-element-prefix,EXSLT website Howto 表示extension-element-prefix 用于“防止扩展名称空间在结果树中输出”。

但是这不是真的(使用 libxslt)。只有exclude-result-prefixes 删除了扩展命名空间。那么为什么我需要extension-element-prefix ???

示例:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:exsl="http://exslt.org/common" version="1.0"
  extension-element-prefix="exsl">

<xsl:template match="/">
  <blabla/>
</xsl:template>

</xsl:stylesheet>

我使用 libxslt (xsltproc) 的输出:

<?xml version="1.0"?>
<blabla xmlns:exsl="http://exslt.org/common"/>

【问题讨论】:

【参考方案1】:

要使用命名空间http://exslt.org/common 中的EXSLT 函数,您不需要extension-element-prefix 属性。仅当您想在命名空间 http://exslt.org/functions 中使用像 func:function 这样的扩展元素时才需要这样做。 extension-element-prefix 属性仅表示带有该前缀的任何元素都不是文字结果元素,而是除了 XSLT 语言定义的那些指令之外的扩展指令。

至于exclude-result-prefixes,您已经理解了这一点,它有助于避免在结果元素上声明任何命名空间,因为样式表中声明和使用的命名空间仅用于选择路径表达式中的节点或匹配模式或用于插入扩展元素。

【讨论】:

嗯,好的。这是有道理的。我只是想知道为什么我应该使用extension-element-prefix,因为我可以使用http://exslt.org/common 完全删除它。似乎 EXSLT 文档在这部分是错误 extension-element-prefix 仅隐藏输出树中需要 extension-element-prefix 的元素。为了在保存路径上,当我使用 EXSLT 等扩展库时,我将同时使用 extension-element-prefixexclude-result-prefixes 有些人在只需要 exclude-result-prefixes 的情况下一直使用 extension-element-prefixes,它确实有效,因为 EEP 有两个作用:它允许您使用扩展元素的命名空间(可以忽略的特权),并将命名空间添加到 ERP 列表中。

以上是关于XSLT 命名空间声明中的 exclude-result-prefixes 和 extension-element-prefix 有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

XSLT 在与根元素具有相同命名空间声明的内部标记中缺少命名空间

重命名元素的 XSLT 问题——更改命名空间

XML 元素名称中包含的 XSLT 命名空间 URI

将命名空间从 java 传递给 xslt,并使用 java 中的参数作为 xslt 中的节点

xslt 中的 XML 命名空间处理

在命名空间定义中使用变量