2009-08-18 20 views
0

私はXSLを使用して重複を含むXMLファイルからアイテムのユニークなリストを抽出するためにウェブ上で利用可能なテクニックを読んでいます。XSL:グルーピングとコールテンプレートの組み合わせ

2つのカテゴリにこれらの範囲: 1)Muenchian方法(例:http://www.jenitennison.com/xslt/grouping/) 2)または前-兄弟ルックアップ これらの両方によってグループにデータを選択するXPath式に依存しています。

しかし、私が解決しようとしているXMLファイルでは、データはXMLファイルに「ネイティブ」には存在しません。私はxsl:テンプレートを使用して、要素から集計されたデータを計算しています。集計したデータに基づいてグループ化したいと思います。例えば

私が持っている:

<filmsreview> 
    <record><data name='movie'>Star Wars</data><data name='ratings'>John:Good, Mary:Good</data></record> 
    <record><data name='movie'>Indiana Jones</data><data name='ratings'>John:Good, Mary:Bad, Helen:Average</data></record> 
    <record><data name='movie'>Titanic</data><data name='ratings'>John:Bad, Helen:Good</data></record> 
</filmsreview> 

私は、データの構造化が完全ではなく、サブ要素を作成することによって、私は簡単に何かをすることができることをことを知っているが、私は簡単にデータソースを変更、それではを任せることはできませんこれを挑戦にしてください。

そして私は、私はジョンの明確な評価持つ総集編構築したいと思います: ジョンの評価を: グッド 悪い

私はXSLを持っている:レコード要素を取り、このレコードのジョンの評価を返すことができますテンプレート: 例:

<xsl:template name="get_rating"> 
    <xsl:param name="reviewer" /> 
    <!-- I use some string manipulation, and xsl:value-of to return the review for John--> 
</xsl:template> 

私はちょうどXSLの下でそれを呼び出すことができますため、各ジョンのレビューの完全なリストを取得します。しかし、私は、この呼び出しを一意の値を取得するためのメソッドと組み合わせることはできません。

XMLファイルをより構造化された方法に変換するために中間のXSLを使用する必要がありますか?あるいは、私は一歩一歩を踏み出すことができますか?

感謝 ジェラルド

答えて

1

うーん...これはおそらく、このような何かXSLT変数およびノー​​ドセットの方法を使用して可能でなければなりません。この時点で

<xsl:variable name="_johnsRatings"> 
    <xsl:apply-templates select="/" mode="johnsRatings" /> 
</xsl:variable> 
<xsl:variable name="johnsRatings" select="msxsl:node-set($_johnsRatings)" /> 

<xsl:template match="/" mode="johnsRatings"> 
    <Ratings> 
     <xsl:for-each select="/filmsReview/record/data[@name='ratings']"> 
       <Rating><xsl:call-template name="get_rating" /></Rating> 
     </xsl:for-each> 
    </Ratings> 
</xsl:template> 

を、それを照会することが可能なはずです標準のXPathクエリを使用する$ johnsRatings変数を使用して、上記の2つの方法のいずれかを使用して、そこから一意の値を取得することができます。

希望するもの

EDIT: 使用しているXSLTエンジンがわからないため、msxsl:node-set()関数にアクセスできると仮定しました。しかし、ほとんどのXSLTプロセッサには同様のメソッドがありますので、プロセッサ内で同等のメソッドを検索する必要があります。

+0

ありがとうございます。 答えを完了かもしれないいくつかのこと: 次の属性は、XSLに追加する必要があります:stylesheet要素 のxmlns:msxsl =「壷:スキーマ - マイクロソフト - com:XSLT」 定義するには、次のキーを必要とします。 ユニークなアイテムを取得するために次のループを実行できます:

関連する問題