2011-08-16 7 views
2

XSLT変換について少し助けてくれることを期待していました。私はそれを正しくするように見えることはできません。ここでXSLT変換に関するヘルプ

は、ソースXML文書のサンプルです:

<?xml version="1.0" encoding="UTF-8"?> 
    <Locations> 
    <header> 
     <location>Location Field</location> 
     <job_function>Job Function Field</job_function> 
     <count>Count</count> 
    </header> 
    <data> 
     <location>2177</location> 
     <job_function>ADM</job_function> 
     <count>1</count> 
    </data> 
    <data> 
     <location>2177</location> 
     <job_function>OPS</job_function> 
     <count>1</count> 
    </data> 
    <data> 
     <location>2177</location> 
     <job_function>SLS</job_function> 
     <count>5</count> 
    </data> 
    <data> 
     <location>2179</location> 
     <job_function>ADM</job_function> 
     <count>1</count> 
    </data> 
    <data> 
     <location>2179</location> 
     <job_function>SEC</job_function> 
     <count>1</count> 
    </data> 
    </Locations> 

私は、次の形式に変換したい:

<Locations> 
    <data> 
    <PeopleSoftID>2177</PeopleSoftID> 
    <ADM>1</ADM> 
    <OPS>1</OPS> 
    <SLS>5</SLS> 
    <TotalCount>7</TotalCount> 
    </data> 
    <data> 
    <PeopleSoftID>2179</PeopleSoftID> 
    <ADM>1</ADM> 
    <SEC>1</SEC> 
    <TotalCount>2</TotalCount> 
    </data> 
</Locations> 

だから、基本的に、あなたがサンプルソース文書で見ることができるように同じ値を持つ複数の要素があります。宛先文書では、ソース文書内の要素値が<location>であるレコード(<PeopleSoftID>要素)が1つだけになります。 3つの<location>の値が2177であったため、宛先文書にはその値を含む1つの<PeopleSoftID>要素しかありません。ソース文書内の<job_function>要素の値は、宛先文書内の要素になります。その新しい要素の値は、ソース文書の<count>要素の兄弟値になります。宛先文書の<TotalCount>要素は、ソース<job_function>要素から生成されたすべての新しい要素の値の合計です。

誰もが説明を混乱させないように願っています。

私はまだ少しXSLTsに新しいので、私はこれに論理を正しく得るのに問題があります。

私はXSLT 1.0も使用できます。

私が十分な情報を提供していない場合、私に知らせてください。私はできるだけ早く多くを提供しようとします。

ありがとうございました!

+1

xsl:keyとグループ上に読みますか? – Hoons

+0

これは複数の部分からなる質問です。それは「私にとってこのスタイルシートを書いてください」という質問よりも、「この特定の最小限の問題をどのように解決すればよいのですか?質問。 @Hoonsは言ったように、一度に1つの問題を投稿し、これまでに試したことと何が出力されているのかを示すと、役に立つヘルプを得る可能性が高くなります。 – LarsH

+0

私は仕事に戻るときに明日持っているものを投稿します。 Mads Hansenが言及したMuenchianメソッドを使って何かを試しています。みんなありがとう。 – ssoutrs

答えて

1

はあなたのXSLのために今何を持っているか、あなたはどのような出力を得ているMuenchian Method

<?xml version="1.0"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output indent="yes" /> 

    <!--Group the data elements by their location values --> 
    <xsl:key name="data-by-location" match="data" use="location" /> 

    <xsl:template match="Locations"> 
     <xsl:copy> 
      <!--Get a distinct list of location values, 
       using the Muenchian Method --> 
      <xsl:for-each 
       select="data[generate-id() = 
         generate-id(key('data-by-location', location)[1])]"> 
       <xsl:copy> 
        <PeopleSoftID> 
         <xsl:value-of select="location"/> 
        </PeopleSoftID> 

        <!--For every data element matching this location... --> 
        <xsl:for-each select="key('data-by-location',location)"> 
         <!--Create an element using the job_function 
          as the element name --> 
         <xsl:element name="{job_function}"> 
          <!--The value of the count element 
           as the value of the generated element--> 
          <xsl:value-of select="count"/> 
         </xsl:element> 
        </xsl:for-each> 

        <TotalCount> 
         <!--calculate the sum of all the count element values 
          for this location --> 
         <xsl:value-of select="sum(key('data-by-location', 
                  location)/count)"/> 
        </TotalCount> 
       </xsl:copy> 
      </xsl:for-each> 
     </xsl:copy> 
    </xsl:template> 

</xsl:stylesheet> 
+0

おかげでMads、私は明日仕事にあなたのソリューションを入れてみます!あなたの記事は、今日私がMuenchianの方法に出くわした2回目です。私は現在取り組んでいる解決策のためにそれを利用しようとしていましたが、私はあなたの投稿を見て明らかにいくつかの詳細を見逃していました。助けてくれてありがとう。 – ssoutrs

+0

あなたのソリューションは魅力的に機能しました!私は前に使用していないいくつかの構造があるので、起こっているすべてを完全に理解していませんが、私はほとんどを理解しています。コメントにも本当に感謝しています。ありがとう! – ssoutrs

+1

それを聞いてうれしいです。鍵は、最初は少し混乱することがあります。特に、一致するものを理解してから、ノードを検索するための「鍵」として使用されているものを理解してください。ケン・ホルマンのイラストと説明が助けになるはずです。また、Jeni Tennisonはいくつかのページでグループ化について説明しています。http://www.jenitennison.com/xslt/grouping/ –