在下面的XML中,需要使用XPath替换命名空间。
<application xmlns="http://ns.adobe.com/air/application/4.0">
<child id="1"></child>
<child id="2"></child>
</application>
我试过
/application/@xmlns
和
/*[local-name()='application']/@[local-name()='xmlns']
两者都没有给出欲望输出。为了替换文本,我使用了xmltask replace。
<xmltask source="${temp.file1}" dest="${temp.file1}">
<replace path="/application/@xmlns" withText="http://ns.adobe.com/air/application/16.0" />
</xmltask>
答案 0 :(得分:5)
问题是xmlns
不是属性。你不能用XPath选择它。
命名空间是XML中节点名称的一部分:<foo xmlns="urn:foo-namespace" />
和<foo xmlns="urn:bar-namespace" />
不两个具有相同名称和不同属性的节点,它们是两个不同的节点名称和没有属性。
如果要更改命名空间,则必须构造一个全新的节点。
XSLT更适合这项任务:
<!-- update-air-ns.xsl -->
<xsl:transform
version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:air4="http://ns.adobe.com/air/application/4.0"
xmlns="http://ns.adobe.com/air/application/16.0"
>
<xsl:output method="xml" encoding="UTF-8" indent="yes" />
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="air4:*">
<xsl:element name="{local-name()}">
<xsl:apply-templates select="@*|node()"/>
</xsl:element>
</xsl:template>
</xsl:transform>
这个XSLT转换做了两件事:
air4
命名空间中的元素,并构造具有相同本地名称但具有不同命名空间的新元素。发生这种情况是因为XSLT中的默认名称空间声明。 http://ns.adobe.com/air/application/16.0
命名空间用于所有新构造的元素。应用于您的输入XML,结果为
<application xmlns="http://ns.adobe.com/air/application/16.0">
<child id="1"/>
<child id="2"/>
</application>
您可以使用Ant的xslt任务:
<xslt in="${temp.file1}" out="${temp.file1}" style="update-air-ns.xsl" />