XSLT前缀xsl for元素没有绑定



我有一个基于openerp的webservice生成的xml,它包含许多元素的前缀pp。我想通过选择许多元素,使用xslt将该xml文件转换为另一个xml文件。当我尝试执行转换时,它向我显示了前缀pp的错误"前缀xsl for元素未绑定"。我不能像很多答案中描述的那样声明pp,我怎么能忽略这个前缀的使用呢?

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

pp:foo/pp:bar

你必须使用像

这样的技巧
*[local-name() = 'foo']/*[local-name() = 'bar']

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

我找到了一个解决这个问题的方法。我们可以使用这个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>

最新更新