koido Blog

XPerの日々

AILight Banner
AILight Blog

プロフィール

koido Blog

目次

Blog 利用状況

記事分類

過去の記事

タグ

XSLT サンプル フラットXML から 明細XML

XSLTを使用して、フラットなXMLを明細型のXMLに変換するサンプル。

◎変換用のXSLT
同じIDを持つ部分を抜き出して、その部分だけにテンプレートを適応する。
テンプレートでは、繰り返し処理を行う。
select="Data[ID!=string(preceding-sibling::Data[1]/ID)]"の部分で抜き出しを行っている。

  <?xml version="1.0" encoding="UTF-8" ?>
  <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

    <xsl:output method ="xml"/>

    <xsl:template match="/">
      <DataList>
        <xsl:apply-templates select="DataList"/>
      </DataList>
    </xsl:template>

    <xsl:template match="DataList">
      <xsl:apply-templates select="Data[ID!=string(preceding-sibling::Data[1]/ID)]"/>
    </xsl:template>

    <xsl:template match="Data">
      <xsl:comment xml:space ="default"/>
      <Data>
        <ID>
          <xsl:value-of select="ID"/>
        </ID>

        <xsl:for-each select=". | following-sibling::Data[ID=current()/ID]">
          <Details>
            <ProductID>
              <xsl:value-of select="ProductID"/>
            </ProductID>
            <ProductName>
              <xsl:value-of select="ProductName"/>
            </ProductName>
            <Count>
              <xsl:value-of select="Count"/>
            </Count>
          </Details>
        </xsl:for-each>

      </Data>
    </xsl:template>

  </xsl:stylesheet>

◎変換元のXML

  <?xml version="1.0" encoding="utf-8" ?>
  <DataList>
    <Data>
      <ID>D001</ID>
      <ProductID>A001</ProductID>
      <ProductName>Product1</ProductName>
      <Count>10</Count>
    </Data>
    <Data>
      <ID>D001</ID>
      <ProductID>B001</ProductID>
      <ProductName>Product2</ProductName>
      <Count>20</Count>
    </Data>
    <Data>
      <ID>D002</ID>
      <ProductID>A001</ProductID>
      <ProductName>Product1</ProductName>
      <Count>20</Count>
    </Data>
    <Data>
      <ID>D003</ID>
      <ProductID>A001</ProductID>
      <ProductName>Product1</ProductName>
      <Count>10</Count>
    </Data>
    <Data>
      <ID>D003</ID>
      <ProductID>B001</ProductID>
      <ProductName>Product2</ProductName>
      <Count>20</Count>
    </Data>
    <Data>
      <ID>D003</ID>
      <ProductID>C001</ProductID>
      <ProductName>Product3</ProductName>
      <Count>30</Count>
    </Data>
  </DataList>

◎変換後のXML

  <?xml version="1.0" encoding="utf-8"?>
  <DataList>
   <!---->
   <Data>
    <ID>D001</ID>
    <Details>
     <ProductID>A001</ProductID>
     <ProductName>Product1</ProductName>
     <Count>10</Count>
    </Details>
    <Details>
     <ProductID>B001</ProductID>
     <ProductName>Product2</ProductName>
     <Count>20</Count>
    </Details>
   </Data>
   <!---->
   <Data>
    <ID>D002</ID>
    <Details>
     <ProductID>A001</ProductID>
     <ProductName>Product1</ProductName>
     <Count>20</Count>
    </Details>
   </Data>
   <!---->
   <Data>
    <ID>D003</ID>
    <Details>
     <ProductID>A001</ProductID>
     <ProductName>Product1</ProductName>
     <Count>10</Count>
    </Details>
    <Details>
     <ProductID>B001</ProductID>
     <ProductName>Product2</ProductName>
     <Count>20</Count>
    </Details>
    <Details>
     <ProductID>C001</ProductID>
     <ProductName>Product3</ProductName>
     <Count>30</Count>
    </Details>
   </Data>
  </DataList>

以上

投稿日時 : 2009年4月15日 17:30


コメントを追加

タイトル
名前
URL
コメント