1

次の XML ファイルがあるとします。

<a m="1">
    <b n="1" o="2">
        <c p="3">3</c>
        <d/>
    </b>
    <b n="1" o="2">
        <c p="3">3</c>
        <d q="3">
            <e r="2">2</e>
        </d>
        <f s="1"/>
    </b>
</a>

次の式を見つけるにはどうすればよいですか。

1. count(/*/*/*)  =  5
2. count (/*//*)  = 6
3. count (/*/*//@*) = 4

Java でこれらの xpath 式を使用して xml ファイルを実行しましたが、答えが 5,6,4 である理由がわかりません。

誰かが上記の式を(Javaコードを使用せずに)計算する方法を説明できますが、コマンド/*/*/*/*//*およびの実際の概念を理解することはできます/*/*//@*か?

とても有難い

4

3 に答える 3

5
/*/*/*

これにより、すべての「最上位要素の孫が選択されます。これらcは、、、、、dcd

/*//*

これによりb、最上位要素のすべての子孫要素が選択cされます:、、、、、、、、、dbcdef

/*/*//@*

これにより、最上位要素の子またはその子孫のいずれかのすべての属性が選択nされます:、、、、、、、、、、、。opnopqrs

したがって、生成されるカウントはそれぞれ次のようになります。

4, 8, 9

XSLTベースの検証

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output method="text"/>

 <xsl:template match="/">
   <xsl:value-of select="count(/*/*/*)"/>
=========
   <xsl:value-of select="count(/*//*)"/>
=========
   <xsl:value-of select="count(/*/*//@*)"/>
 </xsl:template>
</xsl:stylesheet>

この変換が提供されたXMLドキュメントで実行される場合(決して、ドキュメントに画像を表示しないでください!!!):

<a m="1">
 <b n="1" o="2">
   <c p="3">3</c>
   <d/>
 </b>
 <b n="1" o="2">
   <c p="3">3</c>
   <d q="3">
     <e r="2">2</e>
   </d>
 </b>
 <f s="1"/>
</a>

Xpath式が評価され、その結果が出力にコピーされます

   4
=========
   8
=========
   9
于 2012-08-16T14:36:38.983 に答える
3

1-ルート要素の直接の子孫である要素の直接の子孫を検索するこの場合

/a/b[1]/c
/a/b[1]/d

/a/b[2]/c
/a/b[2]/d
/a/b[2]/f

あなたの答えです。

2-要素の最初のレベルの下にあるすべての子孫(直接または間接)要素この場合

/a/b[1]/c
/a/b[1]/d

/a/b[2]/c
/a/b[2]/d
/a/b[2]/d/e
/a/b[2]/f

あなたの答えです。

3-第1レベルの要素の直接の子孫のすべての子孫に属するすべての属性を検索しますこの場合

/b[1]/@n
/b[1]/@o
/b[1]/c/@p

/b[2]/@n
/b[2]/@o
/b[2]/c/@p
/b[2]/d/@q
/b[2]/d/e/@r
/b[2]/f/@s

あなたの答えです。

あなたがここで見ることができるように、あなたがそれを間違って書いたので、3番目のケースへの答えは9です。返品するには、次のように変更する必要がありますcount(/*/*/*/@*)

編集:Mimoによって指摘されたようにインデックスを修正しました。

于 2012-08-16T14:35:45.267 に答える
0

Java コードをもう一度実行しますが、count 関数は使用しません。ノードのリストが返されます (要素の場合もあれば、属性の場合もあります)。リストを反復処理し、各ノードの名前を書き出します。これは、各カウントにどのノードが含まれているかを理解するのに役立ちます。

于 2012-08-16T14:21:14.577 に答える