0

以下の 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>
4

1 に答える 1

5

問題は、それ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" />
于 2015-02-06T07:59:47.790 に答える