2012-02-29 3 views
1

XSLT를 사용하여 XML을 변환하는 방법을 알아 내려고 애 쓰고 있습니다. 주요 목표는 XML 소스 데이터를 가져 와서 월 데이터를 기반으로 새로운 행을 반복/작성하도록하는 것입니다. 예를 들어, 현재 각 행에는 "X"양의 월 데이터가 모두 하나의 행으로 있습니다. 각 행마다 한 달 분의 데이터 만 포함 할 수 있도록이 문제를 해결하려고합니다. 다음 행에는 동일한 헤더 정보가 포함되지만 원래 소스 행의 다음 달 데이터는 포함됩니다. 다행히도 그것은 의미가 있습니다. 필자는 예제에서 볼 수 있듯이 해당 월의 숫자 값에 대한 새 값을 대상 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

예. 월 매출액에 대해 항상 두 개의 열이 있습니다. 하나는 총에 대한 것이고 다른 하나는 그물에 대한 것입니다. MonthID에 대한 하나의 열에 더하여. 연도는 항상 보고서가 실행되는 현재 연도로 이동합니다. 감사 – 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> 
관련 문제