XPath:选择root,过滤子元素

时间:2017-03-03 01:39:48

标签: xml xpath xquery

考虑以下XML文档:

<inst>
  <ins>
    <id>id_01</id>
    <pos>1</pos>
  </ins>
  <ins>
    <id>id_02</id>
    <pos>1</pos>
  </ins>
</inst>

我尝试获得以下输出:

<inst>
  <ins>
    <id>id_01</id>
    <pos>1</pos>
  </ins>
</inst>

我编写了以下XQuery / XPath-Expression:

doc('database/data.xml')/inst[ins/id='id_01']

这不会给出想要的结果而是整个文档,就好像没有过滤条件那样..但是如果我放入XML文档中不存在的id,结果是空的。

我只是不知道这句话有什么问题。

2 个答案:

答案 0 :(得分:1)

你写的XPath,

/inst[ins/id='id_01']

表示选择包含inst子元素的ins根元素,其子元素的字符串值为"id_01"。由于XML的根确实符合此条件,因此选择它:

<inst>
  <ins>
    <id>id_01</id>
    <pos>1</pos>
  </ins>
  <ins>
    <id>id_02</id>
    <pos>1</pos>
  </ins>
</inst>

您可以使用此XPath,

/inst/ins[id='id_01']

只选择这个XML,

<ins>
  <id>id_01</id>
  <pos>1</pos>
</ins>

但是,没有XPath会选择根元素而不用第二个ins元素,就像你似乎想要做的那样。原因是XPath用于选择,而不是XML的转换。您的XML中没有inst元素可以选择缺少第二个(id_02ins元素。如果要转换XML,请改用XSLT。

答案 1 :(得分:-1)

你可以写一些像

这样的东西

<inst>{doc('database/data.xml')/inst/ins[id eq "id_01"]}</inst>
&#34;价值比较&#34;运算符(eq,lt等)旨在比较单个值,因此最好使用&#39; eq&#39;