Ant - XmlTask​​ - 带xmlns的Xpath谓词

时间:2014-09-30 11:57:40

标签: xml xpath ant

我有一个看起来像这样的xml文件:

<?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>

在ant任务中,我想挑选任何默认设置为true的元素,并将它们更改为false。我几乎可以到达那里:

<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>

(只是将 all 设置为false,无论其中的设置如何)

然后我想设置&#34; SomeApp&#34;默认= true。

如果我不必指定local-name(),我几乎可以到达那里:

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

那么我如何将local-name()内容与谓词结合起来以取出&#34; SomeApp&#34;?

1 个答案:

答案 0 :(得分:0)

您可以使用简单local-name()运算符将application='SomeApp'条件与AND条件结合使用:

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

更新:

我错过了对local-name()节点使用application过滤器。正确的XPath应如下(格式化为可读性):

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