2014-09-30 6 views
0

У меня есть файл XML, который выглядит примерно так:Ant - XmlTask ​​- Xpath предикат Xmlns

<?xml version="1.0" encoding="UTF-8"?> 
<Profile xmlns="http://soap.sforce.com/2006/04/metadata"> 
    <applicationVisibilities> 
     <application>SomeApp</application> 
     <default>true</default> 
     <visible>true</visible> 
    </applicationVisibilities> 
    <applicationVisibilities> 
     <application>AnotherApp</application> 
     <default>false</default> 
     <visible>true</visible> 
    </applicationVisibilities> 
    <applicationVisibilities> 
     <application>YetAnotherApp</application> 
     <default>false</default> 
     <visible>true</visible> 
    </applicationVisibilities> 
    ... 
</Profile> 

В муравей задачи Я хочу, чтобы выбрать любые элементы, которые по умолчанию имеют значение ИСТИНА, и изменить их к ложному. Я могу почти добраться:

<target name="resetApps"> 
    <xmltask todir="stage/deploy/profiles/">   
     <fileset id="fileset" dir="stage/profiles/"> 
      <include name="**/*.profile"/> 
     </fileset> 
     <replace path="//*[local-name()='applicationVisibilities']/*[local-name()='default']/text()" withText="false"/> 
    </xmltask> 
</target> 

(который просто устанавливает их все к ложным, независимо от настроек в)

Тогда я хочу, чтобы установить «SomeApp» по умолчанию = верно.

Опять же, я могу получить почти там, если я не должен указать локальный_файл имя():

<replace path="/Profile/applicationVisibilities[application='SomeApp']/default/text()" withText="true"/> 

Так как же я совместить имя-местный() материал с предикатом для вытаскивания "SomeApp"?

+0

Я не знаком с муравьем, но учитывая, что это, кажется, все о манипуляции XML, я думаю, что он должен предоставить способ работать с пространствами имен должным образом. Посмотрите, как это сделать. – JLRishe

ответ

0

Вы можете комбинировать local-name() критерии с application='SomeApp' критериями с помощью простого AND оператора:

//*[local-name()='applicationVisibilities' and application='SomeApp']/*[local-name()='default']/text() 

UPDATE:

я пропустил использовать local-name() фильтр для application узла. Правильный XPath должен быть следующим (отформатирован для удобства чтения):

//*[ 
    local-name()='applicationVisibilities' 
     and 
    ./*[local-name()='application and .='SomeApp'] 
    ] 
/*[local-name()='default']/text() 
+0

Это не работает, извините. – powlo

+0

@powlo обновил мой ответ – har07

+0

Это тоже не работает ... Я запускаю его через http://xpath.online-toolz.com/tools/xpath-editor.php – powlo