Я работаю над скриптом Greasemonkey, который должен работать на каждом узле между двумя другими. В настоящее время я получаю первый узел, использующий (все более сложное) выражение XPath. У меня есть другое выражение, чтобы получить «между» узлами, но оно содержит начальное выражение дважды и становится довольно длинным. Вот более ранняя версия, которая содержала только два «предложения»:
var xpHeader = "//h2[a/@name='section-References' or a/@name='References']";
var xpContents = "//h2[a/@name='section-References' or a/@name='References']/following-sibling::*[following-sibling::h2[1] = //h2[a/@name='section-References' or a/@name='References']/following-sibling::h2[1]]"
То, что я ищу, - это способ выбора «содержимого» на основе узла контекста, а не повторное включение исходного выражения несколько раз - это выражение «заголовка» очень быстро станет значительно сложнее. Я знаю, что это можно сделать в XSLT с помощью функции current()
, но, конечно, это не доступно в vanilla XPath:
<xsl:template match="//h2[a/@name='section-References' or a/@name='References']">
<xsl:for-each select="following-sibling::*[following-sibling::h2[1] = current()/following-sibling::h2[1]]">
<!-- do stuff -->
</xsl:for-each>
</xsl:template>
Когда я набираю это, мне приходит в голову, что на этом этапе, вероятно, будет проще использовать DOM для сбора содержимого, а не XPath, но мне все еще интересно знать, можно ли это сделать .
Исходная версия скрипта доступна на UserScripts.org .