2015-02-06 1 views
0

В приведенном ниже XML необходимо заменить пространство имен с помощью XPath.Как заменить значение атрибута 1-го узла в 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.

<xmltask source="${temp.file1}" dest="${temp.file1}"> 
    <replace path="/application/@xmlns" withText="http://ns.adobe.com/air/application/16.0" /> 
</xmltask> 
+0

Вы можете разместить свой код, который вы использовали для замены? – ArinCool

ответ

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" /> 
+0

Можете ли вы объяснить задачу xsl? Я попробовал вышеуказанные фрагменты, так как его не удалось заменить. – jass

+0

Я думаю, вам нужно будет посетить экскурсию в документацию, если вы хотите узнать, как работает задача 'xslt'. Я объяснил, почему 'xmltask' не может делать то, что вам нужно, и предоставляет решение, которое делает то, что вы хотите. * Интеграция * решение - это ваша работа. – Tomalak

+0

Хороший код пространства имен, +1. –