从某个节点向上和向下获取XML元素,但仅限于某些元素之间

时间:2015-04-13 12:25:16

标签: xml xpath

这是我必须处理的XML的简化和清理(对于解决方案所需的基础)版本:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<body>
    <p>
      <pPr>
        <section> <!-- section 1 -->
          Some data
        </section>
      </pPr>
    </p>
    <p>
      <bookmarkStart id="0" name="_GoBack"/>
      <bookmarkEnd id="0"/>
    </p>
    <p>
      <bookmarkStart id="1" name="Reminder"/>
      <bookmarkEnd id="1"/>
    </p>
    <p>
      <pPr>
        <section> <!-- section 2 -->
          Some data
        </section>
      </pPr>
    </p>
    <p>
      <bookmarkStart id="2" name="Instruction"/>
      <bookmarkEnd id="2"/>
    </p>
    <tbl>
        Some data
    </tbl>
    <p>
        <section> <!-- section 3 -->
          Some data
        </section>
    </p>
    <section> <!-- section 4 -->
      Some data
    </section>
</body>

我只提供了书签的名称,所以f.e. &#34;提醒&#34 ;.我需要实现的是获取包含第一部分的<p>,该部分恰好位于包含具有给定名称的书签的节点之上+在<p>之后的所有内容,直到下一个 <p>包含section,但没有,下一个<p>

对样本逻辑可能有点过关:

  1. 查找具有作为name属性
  2. 的值提供的给定名称的书签元素
  3. 从该书签中找到第一个section向上的内容,然后选择该部分的父级+它与书签之间的所有内容+书签本身
  4. 从该书签中向下查找section向下的第一次出现,选择书签与该部分的父级之间的所有内容(但不包含该部分的父级本身)
  5. 获取2个选项作为一个合并结果。
  6. 所以,如果给我&#34;提醒&#34; (或&#34; _GoBack&#34;)然后我应该得到这个:

        <p>
          <pPr>
            <section> <!-- section 1 -->
              Some data
            </section>
          </pPr>
        </p>
        <p>
          <bookmarkStart id="0" name="_GoBack"/>
          <bookmarkEnd id="0"/>
        </p>
        <p>
          <bookmarkStart id="1" name="Reminder"/>
          <bookmarkEnd id="1"/>
        </p>
    

    如果给我&#34;说明&#34;然后我应该得到这个:

        <p>
          <pPr>
            <section> <!-- section 2 -->
              Some data
            </section>
          </pPr>
        </p>
        <p>
          <bookmarkStart id="2" name="Instruction"/>
          <bookmarkEnd id="2"/>
        </p>
        <tbl>
            Some data
        </tbl>
    

    依此类推,以防第3部分 4 之间有其他书签。

    到目前为止,我所掌握的最常用的代码是:

    //body/*[following-sibling::node()[self::*[descendant-or-self::bookmarkStart[@name="Instruction"]]] and preceding-sibling::*[*/section][2]] | //body/*[preceding-sibling::node()[self::*[descendant-or-self::bookmarkStart[@name="Instruction"]]] and following-sibling::*[*/section][1]]
    

    但你可以看到我使用的是硬编码索引(如下所示:[*/section][1]),我需要它作为动态解决方案......

    我希望我解释它可以理解。

0 个答案:

没有答案