用于选择所选标签名称的Xpath

时间:2016-03-02 14:24:28

标签: xml xpath

我正在尝试使用xml访问xpath文件。

我为xpath提出的当前代码是:

//*[local-name()='namespace']/*[local-name()='querySubject']/*[local-name()='queryItem']
[contains(., 'searchTerm')]/ancestor-or-self::*/*[local-name()='name']

我的xml如下:

<project xmlns="https://afdsl/skdflsk/d">
    <name>AbcPos</name>
    <property name="included" type="hidden">true</property>
    <locales>
        <locale>en</locale>
        <locale>de</locale>
    </locales>
    <defaultLocale>en</defaultLocale>
    <namespace>
        <name locale="en">AbcPos</name>
        <name locale="de">AbcPos</name>
        <lastChanged>2014-03-05T18:47:30</lastChanged>
        <lastChangedBy>userx</lastChangedBy>
        <property name="included" type="hidden">true</property>
        <namespace>
            <name locale="en">Database Layer</name>
            <name locale="zw">Database Layer</name>
            <querySubject status="valid">
                <name locale="en">qskxyz</name>
                <name locale="zw">qskxyz</name>
                <queryItem>
                    <name locale="en">qixyz</name>
                    <name locale="zw">qixyz</name>
                    <hello>searchTerm</hello>
                </queryItem>
            </querySubject>
        </namespace>
    </namespace>
    <namespace>
        <name locale="en">Names</name>
        <lastChanged>2016-01-12T12:42:46</lastChanged>
        <namespace>
            <name locale="en">Database Layer</name>
            <name locale="zw">Database Layer</name>
            <querySubject status="valid">
                <name locale="en">qsxyz</name>
                <queryItem>
                    <name locale="en">myName</name>
                    <hello>...Hi there..</hello>
                </queryItem>
            </querySubject>
        </namespace>
    </namespace>
</project>

我必须实现以下目标:

  
      
  1. Xpath应仅返回标签<name locale="en">Database Layer</name>的英文名称,而不返回“zw”等其他语言名称。

  2.   
  3. Xpath应仅返回选定的标记名称,而不是所有祖先。   目前它返回所有语言的所有祖先名称,即“en”或“zw”,如下所示

  4.   

当前结果是:

<name>AbcPos</name>
-----------------------
<name locale="en">AbcPos</name>
-----------------------
<name locale="de">AbcPos</name>
-----------------------
<name locale="en">Database Layer</name>
-----------------------
<name locale="zw">Database Layer</name>
-----------------------
<name locale="en">qskxyz</name>
-----------------------
<name locale="zw">qskxyz</name>
-----------------------
<name locale="en">qixyz</name>
-----------------------
<name locale="zw">qixyz</name>

结果是我想要的

<name>AbcPos</name>
-----------------------
<name locale="en">Database Layer</name>
-----------------------
<name locale="en">qskxyz</name>
-----------------------
<name locale="en">qixyz</name>
-----------------------

您可以测试xpath code

1 个答案:

答案 0 :(得分:2)

这应该有效:

//namespace[./descendant::hello[contains(text(), 'searchTerm')] and not(./ancestor::namespace)]/descendant::name[@locale='en']

这与您的逻辑略有不同。第一

//namespace[./descendant::hello[contains(text(), 'searchTerm')] and not(./ancestor::namespace)]

选择第一个最外层的namespace元素,然后选择

/descendant::name[@locale='en']

获取name属性设置为locale

的所有'en'代码

此外,我建议使用这个完美无缺的tool,因为你提供的链接不符合我的要求。