2016-09-17 17 views
0

コンテキストがdivision/division/*トピックを指しているとき、body/divisionの下にあるすべてのtopicタグをカウントし、前のbody/division/divisionタグのカウントに結果を追加したい。XPATH:先行するDiv要素の数をカウントする

出力=ボディ/除算+ボディ/分裂の回数/除算例えばので

<?xml version="1.0" encoding="UTF-8"?> 
    <body> 
     <division> 
      <Atopic><longtitle>TitleDiv1 Atopic</longtitle></Atopic> 
      <Btopic><longtitle>TitleDiv1 Btopic</longtitle></Btopic> 
      <Ctopic><longtitle>TitleDiv1 Ctopic</longtitle></Ctopic> 
      <division> 
      <Atopic><longtitle>TitleDiv1.1 Atopic</longtitle></Atopic> 
      </division> 
      <division> 
       <Atopic><longtitle>TitleDiv1.2 Atopic</longtitle></Atopic> 
      </division> 
     </division> 
     <division> 
      <Atopic><longtitle>TitleDiv2 Atopic</longtitle></Atopic> 
      <Dtopic><longtitle>TitleDiv2 Dtopic</longtitle></Dtopic> 
      <division> 
      <Atopic><longtitle>TitleDiv2.1 Atopic</longtitle></Atopic> 
      </division> 
      <division> 
      <Ctopic><longtitle>TitleDiv2.2 Ctopic</longtitle></Ctopic> 
      </division> 
     </division> 
    </body> 

の下にあるすべてのトピック

  1. 私のコンテキストは本部の1/2である場合、ロジックがすべきbody/division1のすべての*トピックを数えます。したがって、3(Atopic、Btopic、Ctopic)を返します。ここには、前のボディ/除算/除算要素はありません。 Div1/3と同様に、ボディ/ディビジョンタグの下の* 3、またbody/div/divの前にカウントする必要があります(つまり3 + 1 = 4)。

  2. コンテキストがDiv2/1の場合、カウンタはbody/division2の*トピックのみを考慮する必要があります。
    Div2/1 Atopicのロジックを使用すると、Div2タグ(body/division)には2つのトピックがあり、body/div/divの前にはないので "2"を返します。出力= 2。ここではDiv2タグの前身/除算/除算を考慮する必要があり、Div1の本体/除算/除算は考慮しないでください。要するに、ボディ/ディビジョン/ディビジョンは、新しいボディ/ディビジョンに遭遇したときにリセットされるべきである。

plsアドバイス。

+0

これは、以前の質問とどのように違うのですか?http://stackoverflow.com/questions/39531286/xpathget-preceding-childrens –

+0

P.S.あなたの例は、(a)部門に一意のid属性があり、(b)トピックに固有の名前があり、(c)適切にインデントされていれば、はるかに明確になります。 「.... DIV 1 ......」などが正確に何になっているのかははっきりしない。彼らが要素であれば、なぜそれらを要素にしないのですか? –

+0

こんにちは、マイケル、私はまた、トピック/ div *をトピックに追加する必要があるという違いもあります。 "count(ancestor :: division [last()]/* [contains(name()、 'topic')])"あなたのゾルは体/部門の*トピックを考えるときは完璧にうまくいった。しかし、私はまた、コンテキストが1/3のときにそれを返すように、カウントに追加する除算/除算を必要とする(ancestor :: division [last()]/* [contains(name()、 'topic')])結果body/divと1 div/div = 4の下の3つのトピック) –

答えて

1

は、私はここでしか推測していますが、あなたが欲しい私には思える:

<xsl:value-of select="count(ancestor::division[last()]/*[contains(name(), 'topic')]) + count(../preceding-sibling::division)"/> 

テストされていない、私はあなたのコードに対してこれをテストする方法がわからないので。

+0

申し訳ありませんマイケル、count(先行兄弟::分割)returnどこでも0。論理カウント(ancestor :: division [last()]/* [contains(name()、 'topic')])は、要件のために正常に動作します。しかし、私が持っていただけの前div/divタグを数えることです。私はcount(previous :: division [parent :: division])を使ってみましたが、DIV2の結果にDIV1のdiv/div要素の数を加えています。plsヘルプ、私はこの中で少し失われています –

+0

私はXMLに変更を加えましたが、サンプルXMLには属性がありません。 –

+0

私の投稿への編集を参照してください。 –

関連する問題