問題は、それxmlns
が属性ではないことです。XPath では選択できません。
名前空間は、XML のノード名の一部です。名前空間は、名前が同じで属性が異なる 2 つのノードではなく、名前が異なり、属性を<foo xmlns="urn:foo-namespace" />
持た<foo xmlns="urn:bar-namespace" />
ない2つのノードです。
名前空間を変更したい場合は、完全に新しいノードを構築する必要があります。
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 変換は、次の 2 つのことを行います。
- 最初のテンプレート (ID テンプレート) は、特定のノードにより適したテンプレートがない限り、ノードを再帰的にコピーします。
- 2 番目のテンプレートは、名前空間内の要素に一致し
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" />