XSLT中元素的前缀xsl未绑定。

5

我有一个由基于openerp的webservice生成的xml文件,其中许多元素都带有前缀pp。我希望通过使用xslt选择多个元素将该xml文件转换为另一个xml文件。 当我尝试执行转换时,它显示错误“元素的前缀xsl未绑定”用于前缀pp。 我无法像许多答案中描述的那样声明pp,我该如何忽略该前缀的使用?


我无法像许多答案中描述的那样声明pp - 为什么呢?将URI映射到样式表中的适当前缀是解决此问题的正确方法。 - Ian Roberts
1
因为我没有该前缀的URI,它是由OpenERP自动生成的。 - Rida
2个回答

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>

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

你必须使用像这样的技巧

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

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

我应该在哪里编写这行代码 [local-name() = 'foo']/[local-name() = 'bar'] 因为我无法控制XML文件的生成方式,这个XSLT将用于ESB,所以它只是一条消息,我将在其上应用该XSLT。 - Rida
@Rida,你必须在所有涉及带有变量命名空间的元素的selectmatch表达式中使用这个技巧。如果没有看到XML和当前XSLT的示例,就无法更加具体地说明问题。 - Ian Roberts
谢谢你的回答,我找到了解决我的问题的方法。 - Rida

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接