2010-12-13 12 views
1

もう一度ヘルプを受けることを希望します。ここでXSLT:XMLをMuenchian Groupingを使用してテキストファイルに変換する方法

<Report> 
    <RecordValues> 
    <Record> 
     <FieldValue fieldName="firm_name" fieldValue="Firm_1"/> 
     <FieldValue fieldName="firm_number" fieldValue="11"/> 
     <FieldValue fieldName="prepared_by" fieldValue="PARKER"/> 
     <FieldValue fieldName="contact_number" fieldValue="123456789"/> 
     <FieldValue fieldName="trade_date" fieldValue="2010-10-17"/> 
     <FieldValue fieldName="symbol" fieldValue="ADM"/> 
    </Record> 
    <Record> 
    <FieldValue fieldName="firm_name" fieldValue="Firm_1"/> 
     <FieldValue fieldName="firm_number" fieldValue="11"/> 
     <FieldValue fieldName="prepared_by" fieldValue="PARKER"/> 
     <FieldValue fieldName="contact_number" fieldValue="123456789"/> 
     <FieldValue fieldName="trade_date" fieldValue="2010-10-16"/> 
     <FieldValue fieldName="symbol" fieldValue="ACW"/> 
    </Record> 
    <Record> 
     <FieldValue fieldName="firm_name" fieldValue="Firm_2"/> 
     <FieldValue fieldName="firm_number" fieldValue="12"/> 
     <FieldValue fieldName="prepared_by" fieldValue="EDWARDS"/> 
     <FieldValue fieldName="contact_number" fieldValue="123456780"/> 
     <FieldValue fieldName="trade_date" fieldValue="2010-10-19"/> 
     <FieldValue fieldName="symbol" fieldValue="ADS"/> 
    </Record> 
    </RecordValues> 
</Report> 

私が取得する必要が出力されています:

A Firm_1 11 
B PARKER 123456789 
C 2010-10-17 ADM 
C 2010-10-16 ACW 
T 4 
A Firm_2 12 
B EDWARDS 123456780 
C 2010-10-19 ADS 
T 3 

あなたは、私が「firm_name」または「firm_number」でレコードをグループ化する必要が見ることができるようにここに私のサンプル入力XMLです。各グループには、タイプAのレコードが1つ、タイプBのレコードが1つ、タイプCのレコードが複数必要です。レコード「T」はレコード「T」のない各グループの合計です。入力XMLはすでにソートされています。私はMuenchianメソッドレコードをグループ化していますが、何も成功しませんでした。明らかに私は何か間違っている。ここに書いたXSLTは次のとおりです。

<?xml version="1.0"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="text"/> 
    <xsl:strip-space elements="*"/> 

    <xsl:key name="value-by-firm" match="Report/RecordValues/Record/FieldValue" use="firm_number"/> 
    <xsl:template match="Record"> 
    <xsl:for-each select="FieldValue/@fieldValue[count(. | key('value-by-firm', firm_number))]"> 
    <xsl:text>A </xsl:text> 
    <xsl:value-of select="firm_name"/> 
    <xsl:text> </xsl:text> 
    <xsl:value-of select="firm_number"/> 
    <xsl:text>&#xA;</xsl:text> 
    <xsl:text>B </xsl:text> 
    <xsl:value-of select="prepared_by"/> 
    <xsl:text> </xsl:text> 
    <xsl:value-of select="contact_number"/> 
    <xsl:text>&#xA;</xsl:text> 
    <xsl:for-each select="key('value-by-firm', firm_number)"> 
     <xsl:text>C </xsl:text> 
     <xsl:value-of select="trade_date"/> 
     <xsl:text> </xsl:text> 
     <xsl:value-of select="symbol"/> 
     <xsl:text>&#xA;</xsl:text> 
    </xsl:for-each> 
    </xsl:for-each> 
</xsl:template> 
</xsl:stylesheet> 

多分、別の方法があります。前もって感謝します。

+0

これは*何らかの意味をなすものではありません! 「タイプAのレコード」、「タイプBのレコード」、「タイプCのレコード」、「タイプTのレコード」とは何ですか?どのような値が合計されますか? –

+0

@Dimitre Novatchev:これは単なるハードコードされたレコード識別子です。 – klipa

+0

合計は、1つの会社の合計レコード数を表示する必要があります。 – klipa

答えて

1

このスタイルシート:

​​

出力:

A Firm_1 11 
B PARKER 123456789 
C 2010-10-17 ADM 
C 2010-10-16 ACW 
T 4 
A Firm_2 12 
B EDWARDS 123456780 
C 2010-10-19 ADS 
T 3 

:あなたはそれがMのように見える...これは複雑ではありませんが、あなたのスキーマが、コードは非常に冗長になります見ることができるようにデータ・ダンプ用の$ XMLフォーマット。

+0

@Alejandro:ありがとうございました。なぜ私はあなたが 'firm_number'と 'contact_number'を連結したのか分からなかったのですか? – klipa

+0

@klipa:それが鍵だから、あなたは会社とそれを "準備した"人とでグループ化していて、その人の連絡先番号が一意であるように見えます。 –

+0

アレハンドロ:ありがとう。 – klipa

1

「間違った」ものをグループ化し、グループを誤って使用しています。

  • Record要素をグループ化しようとしています。あなたのxsl:keyで一致する必要があります(use=...属性は企業名を参照する必要があります)
  • グループ化の仕組みは、各グループを1回だけ処理することで機能します。 xsl:keyで各キーを明示的に処理することはできませんので、すべての値を処理し、グループ内の最初のの値を除いてすべて無視し、グループ全体の処理を行います。つまり、foreachはxsl:keyと同じ要素を選択し、ノードテストala [count(. | reference-to-group[1]) = 1]を追加する必要があります。ここでは、[1]= 1部分を忘れてしまいました。

固定XSLTファイル、その後は(フィールドの検索も若干変更し、私はT計算を追加していないことに注意してください。

<?xml version="1.0"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="text"/> 
    <xsl:strip-space elements="*"/> 

    <xsl:key name="value-by-firm" match="/Report/RecordValues/Record" use="FieldValue[@fieldName='firm_number']/@fieldValue"/> 
    <xsl:template match="/"> 
    <xsl:for-each select="/Report/RecordValues/Record[count(. | key('value-by-firm', FieldValue[@fieldName='firm_number']/@fieldValue)[1]) = 1]"> 
     <xsl:text>A </xsl:text> 
     <xsl:value-of select="FieldValue[@fieldName='firm_name']/@fieldValue"/> 
     <xsl:text> </xsl:text> 
     <xsl:value-of select="FieldValue[@fieldName='firm_number']/@fieldValue"/> 
     <xsl:text>&#xA;</xsl:text> 
     <xsl:text>B </xsl:text> 
     <xsl:value-of select="FieldValue[@fieldName='prepared_by']/@fieldValue"/> 
     <xsl:text> </xsl:text> 
     <xsl:value-of select="FieldValue[@fieldName='contact_number']/@fieldValue"/> 
     <xsl:text>&#xA;</xsl:text> 
     <xsl:for-each select="key('value-by-firm', FieldValue[@fieldName='firm_number']/@fieldValue)"> 
     <xsl:text>C </xsl:text> 
     <xsl:value-of select="FieldValue[@fieldName='trade_date']/@fieldValue"/> 
     <xsl:text> </xsl:text> 
     <xsl:value-of select="FieldValue[@fieldName='symbol']/@fieldValue"/> 
     <xsl:text>&#xA;</xsl:text> 
     </xsl:for-each> 
    </xsl:for-each> 
    </xsl:template> 
</xsl:stylesheet> 

編集:最後の注意:あなたは、この特定のやっていることをデータスキーマはXSLTの強力なポイントの1つではありません。自然にはるかにクリーンなスキーマ(例えば、名前と値のペアがXMLの自然な名前と値のペア、つまり属性で表される)に自然に変換できるデータ構造を持っているようです。あるいは、実際のプログラミング言語(このデータがほぼ確実に得られる)にインポートすることもできます。この言語では、FieldValue e fieldName属性とfieldValue属性は表示されません。基本的に;これはXML + XSLTでも可能ですが、より自然な表現で表現し、より自然なツールで処理するよりも、はるかに複雑で脆弱なソリューションになります。

+0

ありがとうございます。私のXSLTの知識は非常に限られています。いくつかの例を教えてください。ありがとう。 – klipa

+0

うわー、それは本当に速かった。どうもありがとう。多分あなたはレコード数を私に助けることができますか? – klipa

関連する問題