0

XSLを使用して重複を含むXMLファイルからアイテムの一意のリストを抽出するために、Webで利用可能な手法を興味深く読みました。

これらは2つのカテゴリに分類されます:1)Muenchianメソッド(例:http ://www.jenitennison.com/xslt/grouping/ )2)または前の兄弟ルックアップこれらは両方ともXPath式に依存してデータを選択しますグループ化する。

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

たとえば、私は持っています:

<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>

データの構造化が完璧ではなく、サブ要素を作成することで簡単にできることはわかっていますが、データソースを簡単に変更することはできないので、これを挑戦してみましょう。

そして、私がジョンの明確な評価を持っている要約を作りたいと思います:ジョンの評価:良い悪い

レコード要素を取得して、このレコードに対するJohnの評価を返すことができるxsl:templateがあります。例:

<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:for-eachの下で呼び出すだけで、Johnのレビューの完全なリストを取得できます。しかし、この呼び出しをどのメソッドとも組み合わせて、一意の値を取得することはできません。

XMLファイルをより構造化された方法に変換するために中間XSLを使用する必要がありますか?または、1つのステップで実行できますか?

Gerardに感謝します

4

1 に答える 1

1

うーん...これは、xslt変数とnodesetメソッドを使用して可能になるはずです。おそらく次のようなものです。

<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つの方法のいずれかを使用して、変数から一意の値を取得できます...

お役に立てば幸い

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

于 2009-08-18T17:15:46.043 に答える