12

次のことを行う XPath 式を作成する必要があります。

  • デフォルトで「NodeA」内の要素を返します
  • 空でない場合は、「NodeB」内の要素を返します。

ターゲット構造が明確に見えるように、サンプル XML を次に示します (MS InfoPath を使用しています)。

<?xml version="1.0" encoding="UTF-8"?><?mso-infoPathSolution solutionVersion="1.0.0.10" productVersion="14.0.0" PIVersion="1.0.0.0" href="file:///C:\Documents%20and%20Settings\Chris\Local%20Settings\Application%20Data\Microsoft\InfoPath\Designer3\9016384cab6148f6\manifest.xsf" ?><?mso-application progid="InfoPath.Document" versionProgid="InfoPath.Document.3"?>
<my:myFields xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns:my="http://schemas.microsoft.com/office/infopath/2003/myXSD/2012-09-07T14:19:10" xmlns:xd="http://schemas.microsoft.com/office/infopath/2003" xml:lang="en-us">
<my:NodeASection>
    <my:NodeA>2012-09-13</my:NodeA>
</my:NodeASection>
    <my:NodeBSection>
        <my:NodeBGroup>
            <my:NodeB>2012-09-14</my:NodeB>
        </my:NodeBGroup>
    </my:NodeBSection>
</my:myFields>

この XPath 式を使用して、テキストの存在について NodeB を評価できます。boolean(//my:NodeB[(text())])

「ベッカー法」について聞いたことがありますが、両方のノードが存在する場合にどのように適用されるかわかりません。私はXPathに非常に慣れていないので、提供できるヘルプに感謝します。

4

3 に答える 3

17

次の XPath 式は、NodeB が存在する (およびテキスト コンテンツがある) 場合は NodeB を返し、それ以外の場合は NodeA を返します。

//my:NodeB[text()] | //my:NodeA[text() and not(//my:NodeB[text()])]

/*このように、選択したノードの後に​​追加できるすべてのサブ要素を取得する場合

//my:NodeB[text()]/* | //my:NodeA[text() and not(//my:NodeB[text()])]/*
于 2012-09-11T13:11:43.347 に答える
4

正しい XPath 式は次のとおりです。

(//my:NodeB[node()] | //my:NodeA[not(//my:NodeB/node())])/node()

述語の条件は相互に排他的であるため、そのうちの 1 つのみが可能でtrue()あり、これにより、括弧内の式によって 2 つのノードのうちの 1 つだけが選択されることが保証されます。

したがって、上記の式は、子であるノードを選択します: 子があるmy:NodeB場合、またはmy:NodeA-- そうでない場合。

ここでは、最大で 1 つの指定された要素と、指定my:NodeAされた最大で 1 つの要素my:NodeBが XML ドキュメントに存在すると仮定します。

もう 1 つの仮定は、プレフィックスmyがバインドされている名前空間が XPath 式エバリュエーター (使用している特定の XPath 実装) に「登録」されていることです。

提供された XML ドキュメントでは、どちらの要素も要素の子も持たないことに注意してmy:NodeAください(my:NodeBどちらもテキスト ノードの子のみを持ちます)。

于 2012-09-12T12:42:31.527 に答える
1

ドキュメントの順序で NodeA が NodeB の前に来るという事実に頼っても安全な場合 (サンプルで暗示されているように)、必要な要素を選択するためのより単純ではるかに効率的な XPATH 式は...

(//my:NodeA[text()]|//my:NodeB)[1]

上記は要素を選択します。要素のテキスト ノードを選択する場合は、代わりに...

(//my:NodeA[text()]|//my:NodeB)[1]/text()

NodeA と NodeB の間に位置関係がなく (相対的な順序で来る可能性があります)、XPATH 2.0 を使用している場合、次の式は必要なテキスト ノードを選択します。

(//my:NodeA[text()],//my:NodeB)[1]/text()
于 2012-09-11T13:29:07.203 に答える