2009-03-26 3 views
0

私はGreasemonkeyスクリプトを作成しています。このスクリプトは、2つの他のノード間で各ノードを操作する必要があります。現在、(ますます複雑な)XPath式を使用して最初のノードを取得しています。 "between"ノードを取得する別の式がありますが、最初の式が2回含まれていてかなり長くなっています。ここでは2つだけ「の句」含まれる以前のバージョンです:私は何を探していますが、コンテキスト・ノードではなく、元の式を複数回再登録に基づいて「コンテンツ」を選択する方法です現在のノードと現在のノードの間にあるすべてのノードをcurrent()なしで取得しますか?

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]]" 

は - 」というヘッダー "の表現はかなり複雑になります。私は、これはcurrent()機能を使用してXSLTで行うことができます知っているが、当然のことながらバニラの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よりもむしろコンテンツを収集するのに使いやすくしましたが、これができるかどうかはまだ分かっています。

スクリプトの元のバージョンはavailable on UserScripts.orgです。

+0

XPath式が実行されているXML文書が提供されていない場合は、生産的ではありません。誰も、質問内のXPath式が何を選択しているのか理解できません。誰かが解決策を提供するとはどういうことでしょうか?私は編集しなければ、下降する寸前です。 –

+0

...提供されたリンクには、テスト文書への完全なソースとリンクの両方が含まれています。何をもっと欲しかったのですか? –

+0

提供されたリンクにはXML文書はありません!未知のものを選択するためにXPath式を書くにはどうすればよいでしょうか? –

答えて

2

XPath式をJavascriptに書きますが、それらは単なる文字列です。文字列を連結することができます。

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

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

+0

これは実際には悪い考えではありません。それは確かにメンテナンスの問題に対処します。 :-) –

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 Selectors

jQuery Traversal

jQuery next()

jQuery nextAll()

2

それはあなたがそのレベルで物事を収集するためにXPathを使用したら、DOMは、少し簡単になります使用してのように聞こえます。 、あなたは何のフレームワークを使用しないの線に沿って何かを仮定:

var nodes = document.evaluate("//h2[a/@name='section-References' or a/@name='References']/following-sibling::*", document, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null); 
var contents=[]; 
if (nodes.snapshotLength>0) contents.push(new Array()); 
var currentGroup=0; 
for (var i=0;i<nodes.snapshotLength;i++) { 
    if (nodes.shapshotItem(i)==<your favorite way to detect the right flavor of h2 element>) { 
    currentGroup++; 
    contents.push(new Array()); 
    continue; 
    } 
    contents[currentGroup].push(nodes.snapshotItem(i)); 
} 

それは少し冗長ですが、あなたは面白いh2のノード間の項目の配列の配列になってしまいます。

関連する問題