这是我必须处理的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>
。
对样本逻辑可能有点过关:
name
属性section
向上的内容,然后选择该部分的父级+它与书签之间的所有内容+书签本身 section
向下的第一次出现,选择书签与该部分的父级之间的所有内容(但不包含该部分的父级本身) 所以,如果给我&#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]
),我需要它作为动态解决方案......
我希望我解释它可以理解。