xslt - XSL : Ignoring/stripping namespaces in secondary documents

标签 xslt namespaces document strip

我正在编写一个 XSL 模板,它从许多次要来源中提取数据。示例辅助文档如下所示:

<toplevel xmlns:foo1="http://foo1">
 <path xmlns="http://foo1">
   <mytag>bar</mytag>
  </path>
</toplevel>

在 XSL 中,我这样做:
<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:foo1="http://foo1"
 exclude-result-prefixes="foo1">
  <xsl:variable name="secondary1" select="document('secondary1.xml')/toplevel"/>
  <foo>
    <xsl:value-of select="$secondary1//foo1:path/foo1:mytag"/>
  </foo>
</xsl:stylesheet>

有很多次要资源,每个资源都使用不同的命名空间,为每个标签添加前缀很乏味,而且无论如何重复都不是正确的做法。有没有办法使用 document() 来剥离导入的节点集的命名空间(或以另一种方式实现相同的效果)?

最佳答案

在 XPath/XSLT 1.0 中,要按名称选择命名空间限定的元素,您必须使用前缀。在 XSLT 2.0 中,您可以使用 xpath-default-namespace功能,它允许您为 XPath 表达式设置默认命名空间,因此您不必再使用前缀。见 XSLT 2.0: xpath-default-namespace更多细节。您可以在样式表中的任何元素上使用此属性,除非被覆盖,否则它对所有后代元素都有效。 (用 xsl 限定它:当你想把它放在一个非 XSLT 元素上时,即一个文字结果元素。)

在 XPath 1.0 中,您还可以笨拙地使用本地名称选择元素,例如 *[local-name() = 'path']/*[local-name() = 'mytag'] .在 XPath 2.0 中,为了更简洁,您可以使用 namespace 通配符,如 *:path/*:mytag , as described here .这是一个有点有争议的补充,因为它似乎鼓励和/或证明您的系统显然正在使用的命名空间的相同可疑使用。

关于xslt - XSL : Ignoring/stripping namespaces in secondary documents,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2047812/

相关文章:

c# - 当我尝试使用自定义服务器控件(在 App_Code 目录中)时全局命名空间出现问题

c++ - using 声明是否仅导入在 using 声明之上声明的重载?

javascript - 如何在 Javascript 中获取没有主机名的引用 URL?

xml - XSLT 2.0 分组 <xsl :for-each-group>

xml - XSLT Muenchian 分组忽略特定组

php - 在生产中获取 "Class not found in"但不在本地或开发服务器上

javascript - 如何在 IE 中的文档上触发 "onload"事件

pdf - 从 LISP 生成 PDF 文档

c# - 如何使用 xml 将内容多行转换为 html

xslt - XML 没有以正确的方式生成