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