Проблема в том, что 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" />
Вы можете разместить свой код, который вы использовали для замены? – ArinCool