2009-07-15 2 views
2

XSLで現在のノードを取得する機能があることは知っていますが、以前のノードと次のノードを参照できる方法があります。現在位置? XPath Axes on W3:あなたはpreceding-siblingfollowing-sibling軸を参照して、(例えばfor-eachループなど)現在の実行の流れとは反対に、文書構造の次と前のノードについて話していると仮定すると、XSL(T)current/previous/next

答えて

4

いいえ。現在のコンテキストは、どのノードが「次」または「前」であるかを知ることができません。

、例えば、テンプレートが適用されたとき、メカニックはこのように行くので、これは次のとおりです。

  1. あなたが実行します。<xsl:apply-templates select="*" /><!-- select 3 nodes (a,b,c) -->
  2. XSLTプロセッサは、(A、B、処理すべきノードのリストを作成し、 C)
  3. それらのノードの各々について
  4. 、XSLTプロセッサを選択してテンプレートが呼び出されると、current()ノードが定義され、そしてposition()が定義されているが、テンプレート無しKを有していないこと以外
  5. マッチングテンプレートを実行します実行フローの今の所。
  6. 実行順序は、結果が同じであることが保証されている限り、プロセッサの設定に従います。あなたの(理論的な)予測は、あるプロセッサにとって真実であり、別のプロセッサに対しては間違っているかもしれません。 XSLTのような副作用のないプログラミング言語の場合、このような知識は危険なものになるだろうと思う(人々が実行命令に頼りがちなので)。あなたがfollowing::siblingpreceding::siblingのXPath軸を使用して行うことができますが、それは上記の説明は、それがあったように、質問に答えることをしようと

    次EDIT

    に処理されるかのノードを知ることは異なる何か

尋ねられましたが、OP とは違う意味です。ユニークなノードのみをグループ化/出力することです。

OPの要求に従って、ここではXPath軸を使用してグループ化を達成する方法を簡単に説明します。

XML(項目が事前にソートされている):

<items> 
    <item type="a"></item> 
    <item type="a"></item> 
    <item type="a"></item> 
    <item type="a"></item> 
    <item type="b"></item> 
    <item type="e"></item> 
</items> 

XSLT

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

    <xsl:template match="/items"> 
    <!-- copy the root element --> 
    <xsl:copy> 
     <!-- select those items that differ from any of their predecessors --> 
     <xsl:apply-templates select=" 
     item[ 
      not(@type = preceding-sibling::item/@type) 
     ] 
     " /> 
    </xsl:copy> 
    </xsl:template> 

    <xsl:template match="item"> 
    <!-- copy the item to the output --> 
    <xsl:copy-of select="." /> 
    </xsl:template> 

</xsl:stylesheet> 

出力:

<items> 
    <item type="a"></item> 
    <item type="b"></item> 
    <item type="e"></item> 
</items> 
+0

のように、私は大きなソートリストを処理しています。例えば <項目タイプ= ""> <項目タイプ= ""> <項目タイプ= ""> <項目タイプは= ""> <項目タイプ= "B" > 前の項目が同じ種類であるかどうかを知りたいので、いくつかのCSSをグループ化してグループ化することができます。 – James

+0

これはMuenchianのグルーピングによって最も効果的ですが、アイテムのリストがソートされている場合は、 '' item {@type!= previous-sibling :: item/@ type}」で取得できます。 – Tomalak

+0

これをいくつかの作業コードに入れますか?私はそれを働かせることはできません。以前のものが同じなら、それをHEYと言いますか?ありがとう! – James

1

同じ名前の次のノードを取得するには、次の状況に応じて、

following-sibling::*[name() = name(current())] 

を、あなたは最初の部分でname(.)を使用する必要があります。

0

あなたは、後で処理するための変数で前回と今回追跡することができます。 I.タグ(i-2)、タグ(i-1)を保持し、それらをタグ(i)で使用することができます。

ちょっとしたアイデア。

よろしくお願いいたします。