3

親/祖父母の兄弟の子供から引き出された他の値に基づいて属性値を見つける必要があります。2通りの表現ができると思います。

したがって、次の XML (数千行になる可能性のあるログ ファイルから派生したもの) が与えられます。

<p:log xmlns:p="urn:NamespaceInfo">
 <p:entries>
   <p:entry timestamp="2012-12-31T09:39:25">
     <p:attributes>
       <p:attrib name="Position" value="1B2" />
       <p:attrib name="Something" value="Something_else" />
     </p:attributes>
     <p:msg>
     </p:msg>
   </p:entry>
   <p:entry timestamp="2012-12-31T09:39:25">
     <p:attributes>
       <p:attrib name="Form" value="FormA" />
     </p:attributes>
     <p:msg>
     </p:msg>
   </p:entry>
   <p:entry timestamp="2012-12-31T09:39:25">
     <p:msg>Successful....</p:msg>
   </p:entry>
   <p:entry timestamp="2012-12-31T12:12:12">
     <p:attributes>
       <p:attrib name="Position" value="1B3" />
       <p:attrib name="Something" value="Something_else" />
     </p:attributes>
     <p:msg>
     </p:msg>
   </p:entry>
   <p:entry timestamp="2012-12-31T09:39:25">
     <p:attributes>
       <p:attrib name="Form" value="FormB" />
     </p:attributes>
     <p:msg>
     </p:msg>
   </p:entry>
   <p:entry timestamp="2012-12-31T09:39:25">
     <p:msg>Processing....</p:msg>
   </p:entry>
   <p:entry timestamp="2012-12-31T09:39:25">
     <p:msg>Error1</p:msg>
   </p:entry>
   <p:entry timestamp="2012-12-31T09:39:25">
    <p:msg>Error1</p:msg>
   </p:entry>
 </p:entries>
     ...
</p:log>
  • (<p:attributes>親タグは複数の<p:attrib>子タグを持つことができます)
  • (<p:event>タグには 1 つのタグのみを含めることができます<p:msg>)

valueまず、対応するname属性がの属性の値を取得する必要がありますが、これはPosition、祖父母の兄弟がのテキストをp:entry持つ子を持っている場合に限られます。また、そのセクション内にとどまる必要があります。たとえば、技術的には と が両方の祖父母の兄弟であっても、新しい/ ペアが の前に現れるため、ペアの最初の出現は必要ありません。p:msgError1Position'/'ValuePositionValueError1p:msgError1

次に、取得した子の親のタイムスタンプ属性の値が必要PositionですValue。したがって、位置を見つけてから、祖父母p:entryタグのタイムスタンプ属性値を見つけます。

したがって、この例では、次の値のみを取得できるはずです。

1B3

2012-12-31T12:12:12 (指定された日付/時刻スタンプは任意の値です。これは異なるため、私が参照していたものがわかります)。

ちょっと混乱します。また、データベースからデータを取得するために XQuery を使用しており、各式が特異値になる必要があるため、1 つのインスタンスのみを取得する必要があります。

p:msgwithに関連付けられた最初のタイムスタンプを取得するにはError1、次のようにします。 //p:entry[descendant::p:msg='Error1.'][1]/@timestamp

しかし、他の値を取得するためにツリーに戻ることはできないようです。

p:attrib 孫を持つ p:events のすべてのタイムスタンプを取得できます。//p:entry[descendant::p:attrib[@name=''Position'']]/@timestamp)[1]

しかし、「Error1」が続くものだけに限定することはできないようです。位置に基づいて選択することはできません。最初にコンテンツに基づいて作成する必要があります。

ボーナス質問

ログファイルの次のインスタンスでこれをもう一度行うにはどうすればよいですか? (2 番目のメッセージだけでなく、次の「親/兄弟」の一致に対してError1メッセージが表示されるログ ファイルを次にダウンします)。Error1上記の質問に対する答えが得られれば、これは明らかかもしれません。

4

1 に答える 1

1

更新

OK私はこれを手に入れたと思います。最初の答えは次のとおりです。

//p:msg[text()="Error1"]/../preceding-sibling::p:entry[./*/p:attrib[@name="Position"]][1]/*/p:attrib[@name="Position"]/@value

これはタグから戻って機能しているため、名前がの孫がいるという条件を満たす、先行する親タグp:msgの最初の(そこにある)を簡単に選択できます。[1]p:entryp:attribPosition

タイムスタンプの取得は少し簡単です。

//p:msg[text()="Error1"]/../preceding-sibling::p:entry[./*/p:attrib[@name="Position"]][1]/@timestamp

それを試してみて、あなたの考えを見てください。

元の回答

通常、私は中途半端な回答を投稿しませんが、この質問は非常に複雑であるため、他に何も得られないと思います。最初の段落で説明する内容のxpathを次に示します。

//p:entry[following-sibling::p:entry/p:msg/text()="Error1"]/*/p:attrib[@name="Position"]/@value

これは

祖父母の兄弟p:entryにError1のテキストを持つ子p:msgがある場合に限り、Positionの対応するname属性を持つvalue属性の値。

しかし、「そのセクション内にとどまる必要がある」と言うとき、あなたが何を意味するのかわかりません。明確にできますか?1B2これにより、との両方が返され1B3ます。

質問の2番目の部分では、上記のエントリのタイムスタンプを次のように取得できます。

//p:entry[following-sibling::p:entry/p:msg/text()="Error1" and ./*/p:attrib[@name="Position"]]/@timestamp

繰り返しになりますが、これはあなたが言及した「セクション」のことにはなりません。残念ながら、これはxpathに関する私の(現在の)知識を超えて、もう少し注意が必要です。

于 2012-09-25T21:58:13.877 に答える