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
Tweet

コメントを追加