0

私がxmlを持っているとしましょう

<Root>
<TB>
..
</TB>
<TB>
..

</TB>
<TB>
..
<DIACT>2</DIACT>
</TB>
<TB>
...
<DIACT>3</DIACT>
</TB>
<TB>
----
<DIACT>4</DIACT>
---
</TB>
</Root>

xsltマッピングを使用して、DIACTがnullでないか、DIACTノードが存在する最初のTBノードの位置を取得したいと思います。この場合のように、位置は3として出力を与えるはずです。3番目のTBノードは、DIACTがnullではない最初のノードであるためです。

4

1 に答える 1

1

使用

count(/*/TB[DIACT][1]/preceding-sibling::TB) +1

今後の処理でこれが必要になるため、上記の値を持つ変数を設定します。

<xsl:variable name="vPos" 
              select="count(/*/TB[DIACT][1]/preceding-sibling::TB) +1"/>

または、次を使用することもできますxsl:number

  <xsl:variable name="vPos2">
    <xsl:number count="TB"/>
  </xsl:variable>

2つのテクニックの簡単なデモを次に示します。

 <xsl:template match="/">
    <xsl:variable name="vPos"
        select="count(/*/TB[DIACT][1]/preceding-sibling::TB) +1"/>

    <xsl:value-of select="$vPos"/>
=========== 
    <xsl:for-each select="/*/TB[DIACT][1]">
      <xsl:variable name="vPos2">
        <xsl:number count="TB"/>
      </xsl:variable>
      <xsl:value-of select="$vPos2"/>
    </xsl:for-each>
 </xsl:template>
</xsl:stylesheet>

この変換が提供されたXMLドキュメントに適用される場合:

<Root>
    <TB> .. </TB>
    <TB> ..  </TB>
    <TB> .. 
        <DIACT>2</DIACT>
    </TB>
    <TB> ... 
        <DIACT>3</DIACT>
    </TB>
    <TB> ---- 
        <DIACT>4</DIACT> --- 
    </TB>
</Root>

2つの正しい結果が生成されます:

3
=========== 
3
于 2012-07-31T12:07:59.547 に答える