【问题标题】:XPath: Select root, filter child elementsXPath:选择根,过滤子元素
【发布时间】:2017-07-22 23:43:11
【问题描述】:

考虑以下 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,则结果为空。

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

【问题讨论】:

    标签: xml xpath xquery


    【解决方案1】:

    您编写的 XPath,

    /inst[ins/id='id_01']
    

    表示选择包含ins 子元素和字符串值为"id_01" 的子元素的inst 根元素。由于您的 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_02) ins 元素。如果要转换 XML,请改用 XSLT。

    【讨论】:

      【解决方案2】:

      你可以写一些类似的东西——

      &lt;inst&gt;{doc('database/data.xml')/inst/ins[id eq "id_01"]}&lt;/inst&gt;
      “值比较”运算符(eq、lt 等)是为比较单个值而设计的,因此最好使用 'eq'

      【讨论】:

        猜你喜欢
        • 2012-03-18
        • 1970-01-01
        • 2012-03-29
        • 2015-04-03
        • 2018-05-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多