0

私は、他の 2 つのノード間の各ノードで動作する必要がある Greasemonkey スクリプトに取り組んでいます。現在、(ますます複雑になっている) XPath 式を使用して最初のノードを取得しています。「間」ノードを取得する別の式がありますが、最初の式が2回含まれており、かなり長くなっています。これは、2 つの「条項」のみを含む以前のバージョンです。

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()が、もちろん、標準の 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>

これを入力していると、現時点では XPath よりも DOM を使用してコンテンツを収集する方がおそらく簡単だろうと思いますが、これが可能かどうかを知りたいと思っています。

スクリプトの元のバージョンは、UserScripts.org で入手できます

4

3 に答える 3

2

XPath 式を Javascript に記述していますが、それらは単なる文字列です。文字列を連結できます。

var xpContents = xpHeader + "/following-sibling::*["
  + "following-sibling::h2[1] = " + xpHeader + "/following-sibling::h2[1]"
  + "]";

これで、コンテンツ表現の割り当ての複雑さに影響を与えることなく、ヘッダー表現を好きなだけ複雑にすることができます。XPath エバリュエーターは引き続き文字列全体を解析する必要があり、クエリの最適化がない場合は、複数回評価される可能性がありますが、それでも問題にならないほど高速である可能性があります。

于 2009-03-26T02:57:24.527 に答える
1

jQueryまたは別のJavaScriptフレームワークを使用して、DOMの操作を簡単にすることができます。

例:

// ==UserScript==
// @name           MyScript
// @namespace      http://example.com
// @description    Example
// @include        *
//
// @require     http://ajax.googleapis.com/ajax/libs/jquery/1.3.1/jquery.min.js
// ==/UserScript==

$('h2[some crazy attributes...]').each(function() {
  // Do something
});

XPath属性を介したDOM要素の選択とトラバースの詳細については、jQueryリファレンスを確認してください。

jQueryセレクター

jQueryトラバーサル

jQuery next()

jQuery nextAll()

于 2009-03-26T18:20:19.393 に答える