2012-02-29 16 views
1

XSLTを使用してXMLを変換する方法を理解しようとしています。主な目的は、XMLソースデータを取得し、月データに基づいて新しい行を繰り返し作成することです。例えば、現在、各行は、「X」量の月データをすべて1つの行として有する。私はこれを解消しようとしているので、各行には1ヶ月分のデータしか含まれていません。次に、次の行には同じヘッダ情報が含まれますが、元のソース行の次の月のデータが含まれます。うまくいけばそれは理にかなっている。また、私の例に見られるように、その月の数値の新しい値をターゲットXML内の新しい値としてトリガーするために月の列を構成する方法を理解しようとしています。どんな提案も大いに感謝しています。XSLT XMLを新しい要素グループと属性に変換する方法

ソースコード:結果のXML

<?xml version="1.0"?> 
<?xml-stylesheet type="txt/xsl" href="transform.xsl"?> 
<Report> 
<ReportData> 
<DataSet> 
<Row rowNum="1"> 
<Column name="Title 1"><Val xsi:type="xsd:string">Sample 1</Val></Column> 
<Column name="Title 2"><Val xsi:type="xsd:string">Sample 2</Val></Column> 
<Column name="Title 3"><Val xsi:type="xsd:string">Sample 3</Val></Column> 
<Column name="Title 4"><Val xsi:type="xsd:string">Sample 4</Val></Column> 
<Column name="Title 5"><Val xsi:type="xsd:string">160X600</Val></Column> 
<Column name="Title 6"><Val xsi:type="xsd:string" xsi:nil="true"></Val></Column> 
<Column name="Title 7"><Val xsi:type="xsd:integer">1325600</Val></Column> 
<Column name="MAR_Month_ID"><Val xsi:type="xsd:integer">3</Val></Column> 
<Column name="YEAR"><Val xsi:type="xsd:integer">2012</Val></Column> 
<Column name="MAR_Month_Total"><Val xsi:type="xsd:float">19.00</Val></Column> 
<Column name="MAR_Month_Total_B"><Val xsi:type="xsd:float">22.00</Val></Column> 
</Row> 
<Row rowNum="2"> 
<Column name="Title 1"><Val xsi:type="xsd:string">Sample 1</Val></Column> 
<Column name="Title 2"><Val xsi:type="xsd:string">Sample 2</Val></Column> 
<Column name="Title 3"><Val xsi:type="xsd:string">Sample 3</Val></Column> 
<Column name="Title 4"><Val xsi:type="xsd:string">Sample 4</Val></Column> 
<Column name="Title 5"><Val xsi:type="xsd:string">160X600</Val></Column> 
<Column name="Title 6"><Val xsi:type="xsd:string" xsi:nil="true"></Val></Column> 
<Column name="Title 7"><Val xsi:type="xsd:integer">1325600</Val></Column> 
<Column name="APR_Month_ID"><Val xsi:type="xsd:integer">4</Val></Column> 
<Column name="YEAR"><Val xsi:type="xsd:integer">2012</Val></Column> 
<Column name="APR_Month_Total"><Val xsi:type="xsd:float">18.00</Val></Column> 
<Column name="APR_Month_Total_B"><Val xsi:type="xsd:float">35.00</Val></Column> 
</Row> 
<Row rowNum="3"> 
<Column name="Title 1"><Val xsi:type="xsd:string">Sample 1</Val></Column> 
<Column name="Title 2"><Val xsi:type="xsd:string">Sample 2</Val></Column> 
<Column name="Title 3"><Val xsi:type="xsd:string">Sample 3</Val></Column> 
<Column name="Title 4"><Val xsi:type="xsd:string">Sample 4</Val></Column> 
<Column name="Title 5"><Val xsi:type="xsd:string">160X600</Val></Column> 
<Column name="Title 6"><Val xsi:type="xsd:string" xsi:nil="true"></Val></Column> 
<Column name="Title 7"><Val xsi:type="xsd:integer">1325600</Val></Column> 
<Column name="MAY_Month_ID"><Val xsi:type="xsd:integer">5</Val></Column> 
<Column name="YEAR"><Val xsi:type="xsd:integer">2012</Val></Column> 
<Column name="MAY_Month_Total"><Val xsi:type="xsd:float">25.00</Val></Column> 
<Column name="MAY_Month_Total_B"><Val xsi:type="xsd:float">15.00</Val></Column> 
</Row> 
<Row RowNum="4"> 
<Column name="Title 1"><Val xsi:type="xsd:string">Sample 5</Val></Column> 
<Column name="Title 2"><Val xsi:type="xsd:string">Sample 6</Val></Column> 
<Column name="Title 3"><Val xsi:type="xsd:string">Sample 7</Val></Column> 
<Column name="Title 4"><Val xsi:type="xsd:string">Sample 8</Val></Column> 
<Column name="Title 5"><Val xsi:type="xsd:string">250X600</Val></Column> 
<Column name="Title 6"><Val xsi:type="xsd:string" xsi:nil="true"></Val></Column> 
<Column name="Title 7"><Val xsi:type="xsd:integer">5600</Val></Column> 
<Column name="MAR_Month_ID"><Val xsi:type="xsd:integer">3</Val></Column> 
<Column name="YEAR"><Val xsi:type="xsd:integer">2012</Val></Column> 
<Column name="MAR_Month_Total"><Val xsi:type="xsd:float">0.00</Val></Column> 
<Column name="MAR_Month_Total_B"><Val xsi:type="xsd:float">5.00</Val></Column> 
</Row> 
<Row RowNum="5"> 
<Column name="Title 1"><Val xsi:type="xsd:string">Sample 5</Val></Column> 
<Column name="Title 2"><Val xsi:type="xsd:string">Sample 6</Val></Column> 
<Column name="Title 3"><Val xsi:type="xsd:string">Sample 7</Val></Column> 
<Column name="Title 4"><Val xsi:type="xsd:string">Sample 8</Val></Column> 
<Column name="Title 5"><Val xsi:type="xsd:string">250X600</Val></Column> 
<Column name="Title 6"><Val xsi:type="xsd:string" xsi:nil="true"></Val></Column> 
<Column name="Title 7"><Val xsi:type="xsd:integer">5600</Val></Column> 
<Column name="APR_Month_ID"><Val xsi:type="xsd:integer">4</Val></Column> 
<Column name="YEAR"><Val xsi:type="xsd:integer">2012</Val></Column> 
<Column name="APR_Month_Total"><Val xsi:type="xsd:float">18.00</Val></Column> 
<Column name="APR_Month_Total_B"><Val xsi:type="xsd:float">35.00</Val></Column> 
</Row> 
<Row rowNum"6"> 
<Column name="Title 1"><Val xsi:type="xsd:string">Sample 5</Val></Column> 
<Column name="Title 2"><Val xsi:type="xsd:string">Sample 6</Val></Column> 
<Column name="Title 3"><Val xsi:type="xsd:string">Sample 7</Val></Column> 
<Column name="Title 4"><Val xsi:type="xsd:string">Sample 8</Val></Column> 
<Column name="Title 5"><Val xsi:type="xsd:string">250X600</Val></Column> 
<Column name="Title 6"><Val xsi:type="xsd:string" xsi:nil="true"></Val></Column> 
<Column name="Title 7"><Val xsi:type="xsd:integer">5600</Val></Column> 
<Column name="MAY_Month_ID"><Val xsi:type="xsd:integer">5</Val></Column> 
<Column name="YEAR"><Val xsi:type="xsd:integer">2012</Val></Column> 
<Column name="MAY_Month_Total"><Val xsi:type="xsd:float">18.00</Val></Column> 
<Column name="MAY_Month_Total_B"><Val xsi:type="xsd:float">35.00</Val></Column> 
</ROW> 
</DataSet> 
</ReportData> 
</Report> 

<?xml version="1.0"?> 
<?xml-stylesheet type="txt/xsl" href="transform.xsl"?> 
<Report> 
<ReportData> 
<DataSet> 
<Row rowNum="1"> 
<Column name="Title 1"><Val xsi:type="xsd:string">Sample 1</Val></Column> 
<Column name="Title 2"><Val xsi:type="xsd:string">Sample 2</Val></Column> 
<Column name="Title 3"><Val xsi:type="xsd:string">Sample 3</Val></Column> 
<Column name="Title 4"><Val xsi:type="xsd:string">Sample 4</Val></Column> 
<Column name="Title 5"><Val xsi:type="xsd:string">160X600</Val></Column> 
<Column name="Title 6"><Val xsi:type="xsd:string" xsi:nil="true"></Val></Column> 
<Column name="Title 7"><Val xsi:type="xsd:integer">1325600</Val></Column> 
<Column name="MAR_Month_Total"><Val xsi:type="xsd:float">19.00</Val></Column> 
<Column name="MAR_Month_Total_B"><Val xsi:type="xsd:float">22.00</Val></Column> 
<Column name="APR_Month_Total"><Val xsi:type="xsd:float">18.00</Val></Column> 
<Column name="APR_Month_Total_B"><Val xsi:type="xsd:float">35.00</Val></Column> 
<Column name="MAY_Month_Total"><Val xsi:type="xsd:float">25.00</Val></Column> 
<Column name="MAY_Month_Total_B"><Val xsi:type="xsd:float">15.00</Val></Column> 
</Row> 
<RowNum="2"> 
<Column name="Title 1"><Val xsi:type="xsd:string">Sample 5</Val></Column> 
<Column name="Title 2"><Val xsi:type="xsd:string">Sample 6</Val></Column> 
<Column name="Title 3"><Val xsi:type="xsd:string">Sample 7</Val></Column> 
<Column name="Title 4"><Val xsi:type="xsd:string">Sample 8</Val></Column> 
<Column name="Title 5"><Val xsi:type="xsd:string">250X600</Val></Column> 
<Column name="Title 6"><Val xsi:type="xsd:string" xsi:nil="true"></Val></Column> 
<Column name="Title 7"><Val xsi:type="xsd:integer">5600</Val></Column> 
<Column name="MAR_Month_Total"><Val xsi:type="xsd:float">0.00</Val></Column> 
<Column name="MAR_Month_Total_B"><Val xsi:type="xsd:float">5.00</Val></Column> 
<Column name="APR_Month_Total"><Val xsi:type="xsd:float">24.00</Val></Column> 
<Column name="APR_Month_Total_B"><Val xsi:type="xsd:float">10.00</Val></Column> 
<Column name="MAY_Month_Total"><Val xsi:type="xsd:float">36.00</Val></Column> 
<Column name="MAY_Month_Total_B"><Val xsi:type="xsd:float">15.00</Val></Column></Row> 
</DataSet> 
</ReportData> 
</Report> 

例は、どのような援助を感謝しています。 おかげ

+0

つの質問:1.常に月の二つの連続した列を占有します、または連続した列の異なる数は月のためにそこだろうか? 2.あなたは年を取っていますか?提供されたXML文書にそのようなデータはありません。 –

+0

はい。月の売上値には常に2つの列があります。 1つはグロス、もう1つはネットです。 MonthIDの1つの列に加えて。年は常にレポートが実行されている現在の年になります。ありがとう – Icudycm

答えて

0

はこれを試してみてください:

<!--- you need to complete this variable with all month keys: --> 
<xsl:variable name="monthCodes" select="('JAN','FEB','MAR','APR','MAY','...')"/> 
<xsl:template match="Row"> 
    <!-- saves the month-total columns in a variable--> 
    <xsl:variable name="months" select="Column[contains(@name,'Month_Total')]"/> 
    <!-- groups the $months: starts a new group, if the @name is matching on the regex 'Month_Total$' --> 
    <xsl:for-each-group select="$months" group-starting-with="*[matches(@name,'Month_Total$')]"> 
     <Row> 
      <xsl:variable name="rowNum" select="count(../preceding-sibling::Row/Column[matches(@name,'Month_Total$')]) + position()"/> 
      <xsl:attribute name="rowNum" select="$rowNum"/> 
      <!-- copies all Columns of the current <Row> witch are not in $months --> 
      <xsl:copy-of select="../Column[not(contains(@name,'Month_Total'))]"/> 
      <xsl:variable name="monthCode" select="substring(@name,1,3)"/> 
      <Column name="{$monthCode}_Month_ID"> 
       <Val xsi:type="xsd:integer"> 
        <xsl:value-of select="index-of($monthCodes,$monthCode)"/> 
       </Val> 
      </Column> 
      <Column name="YEAR"> 
       <Val xsi:type="xsd:integer"><xsl:value-of select="year-from-date(current-date())"/></Val> 
      </Column> 
      <!-- copies all nodes of the current Row (the mont h-total columns of the current month) --> 
      <xsl:copy-of select="current-group()"/> 
     </Row> 
    </xsl:for-each-group> 
</xsl:template> 
<xsl:template match="node() | @*"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*"/> 
     <xsl:apply-templates select="node()"/> 
    </xsl:copy> 
</xsl:template> 
関連する問題