0

XML:

   <h>
    <rl>
      <c/>
      <c/>
      <c/>
      <c/>
      <c/>
      <c/>
      <c/>
      <c/>
    </rl>
    <rl>
      <c/>
      <c/>
      <c/>
      <c>.01</c>
      <c/>
      <c/>
      <c/>
      <c/>
    </rl>
    <rl>
      <c/>
      <c/>
      <c/>
      <c/>
      <c/>
      <c/>
      <c/>
      <c/>
    </rl>
    <rl>
      <c/>
      <c/>
      <c/>
      <c/>
      <c>.01</c>
      <c>.01</c>
      <c>.01</c>
      <c>.01</c>
    </rl>
</h>

私が直面した問題は次のとおりです。

<c>特別な条件ですべての要素の4 番目の要素から値を選択する必要があります。<rl>たとえば、それrl[3]/c[4]が現在のノードです。ゼロ以外の値を持つ最後の親の兄弟を見つけて、その値c[4]をチェックする必要があります (この場合rl[2]/c[4]は 0.01 になります)。

どんなアイデアでも大歓迎です。

/EDIT たぶん、私は十分に明確ではありませんでした.0rl以外の値がどの要素にあるかわからないので、数式はそれを見つけるのに十分巧妙でなければなりません. この場合、ゼロ以外の値は 2 番目のrl要素内にありますが、1 番目または 3 番目にある可能性があり、4 番目、5 番目などの要素に一致する場合は、すべてのステップでrl空でない要素から値を見つける必要があります。rl

4

3 に答える 3

0

例の xml では、キー ベース ソリューションが行います r1 に c "potion のキーを追加します。

<xsl:key name="kCpos" match="rl/c" use="count(preceding-sibling::c)+1"/>

特定のポーション(例:4)と条件(テキストあり)ですべての c を簡単に選択できます。

<xsl:value-of select="key('kCpos', 4)[text()]"/>

rlこの条件の を取得するには:

<xsl:value-of select="key('kCpos', 4)[text()]/.." />

4は次のようなもので再発する可能性がありますcount(preceding-sibling::c)+1

于 2013-05-28T10:05:36.010 に答える
0

現在のノードがrl[3]/c[4]あり、取得したい場合は<c>.01</c>XPATH を使用しますrl[3]/c[4]/parent::rl/preceding-sibling::rl[1]/c[4]

于 2013-05-28T09:59:17.283 に答える
-1

わかりました、これを解決するのに少し時間がかかりましたが、ここにあります:

<xsl:template match="c">
<xsl:variable name="prev-non-zero-value">
<xsl:value-of select="../preceding-sibling::rl[child::c[position()='4']!=''][position()='1']/c[position()='4']"/>
</xsl:variable>
</xsl:template>

それを説明するには:c要素を照合prev-non-zero-valueし、値を持つ変数を作成しています:
1. ../preceding-sibling::rl-cの親の前の兄弟を選択: ( rl)
2. [child::c[position()='4']- '' とは異なる値rlを持つ 4 番目の子要素を持つ要素のみを照合します 3.最初に一致したものを選択しますリストからの要素 (先行する要素は「上」にカウントされるため) 4. - 指定された要素の4 番目の子要素を選択する 5. 利益c
[position()='1']rl
/c[position()='4']crl

これは非常に複雑なので、これを解決する方法が他にある場合は、どんな提案もお待ちしています ;)

于 2013-05-29T06:26:46.067 に答える