5

我有一个基于 openerp 的 web 服务生成的 xml,它包含许多元素的前缀 pp。我想通过选择许多元素使用 xslt 将该 xml 文件转换为另一个 xml。当我尝试执行转换时,它向我显示前缀 pp 的错误“元素的前缀 xsl 未绑定”。我无法声明 pp,因为它在许多答案中都有描述,我怎么能忽略它的使用字首?

4

2 回答 2

1

XPath 提供了pp:*语法来选择具有特定名称空间 URI 的所有元素/属性,而不管它们的本地名称如何,但不能(直接)选择具有特定本地名称的所有元素/属性,而不管名称空间如何。如果您事先不知道命名空间 URI 将是什么,那么

pp:foo/pp:bar

你必须使用类似的技巧

*[local-name() = 'foo']/*[local-name() = 'bar']

文档使用“pp”作为前缀这一事实无关紧要,对于 XPath 和 XSLT(以及任何其他可识别名称空间的 XML 处理工具)而言,重要的是元素的本地名称及其名称空间 URI。前缀只是一个允许解析器将正确的命名空间 URI 附加到每个节点的设备。

于 2013-06-10T16:47:51.367 回答
1

我找到了解决这个问题的方法。我们可以使用这个 XSLT 转换来忽略 XML 文件中的所有命名空间和前缀:

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:template match="@*|node()[not(self::*)]">
  <xsl:copy/>
 </xsl:template>

 <xsl:template match="*">
  <xsl:element name="{local-name()}">
   <xsl:apply-templates select="node()|@*"/>
  </xsl:element>
 </xsl:template>
</xsl:stylesheet>
于 2013-06-15T11:15:18.523 回答