XSLT元素的前缀xsl未绑定

时间:2013-06-10 16:30:40

标签: xslt

我有一个基于openerp的web服务生成的xml,它包含许多元素的前缀pp。我想通过选择许多元素使用xslt将该xml文件转换为另一个xml。 当我尝试执行转换时,它向我显示错误'前缀xsl for element is not bound'作为前缀pp。 我不能声明pp,因为它在许多答案中有描述,我怎么可以忽略该前缀的使用?

2 个答案:

答案 0 :(得分:1)

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

pp:foo/pp:bar

你必须使用像

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

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

答案 1 :(得分: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>