2009年12月5日土曜日

XSLT で直積

直積を求める XSLT を書いてみる。SQL の SELECT で FROM に複数テーブルを書いて JOIN せずに置くと出来てくる、こんな感じのあれ。
a
b
 × 
1
2
3
 → 
a1
a2
a3
b1
b2
b3

以下のような XML の変換になる。
<?xml version="1.0" encoding="UTF-8"?>
<two-tables>
<alpha-list>
<alpha>a</alpha>
<alpha>b</alpha>
</alpha-list>
<num-list>
<number>1</number>
<number>2</number>
<number>3</number>
</num-list>
</two-tables>
↓↓↓
<?xml version="1.0" encoding="UTF-8"?>
<cartesian-product>
<alpha-num>
<alpha>a</alpha><number>1</number>
</alpha-num>
<alpha-num>
<alpha>a</alpha><number>2</number>
・・・略
<alpha>b</alpha><number>3</number>
</alpha-num>
</cartesian-product>


こんな XSLT が 一個の解になる。(Eclipse で確認)
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/two-tables">
<cartesian-product>
<xsl:apply-templates select="alpha-list"/>
</cartesian-product>
</xsl:template>
<xsl:template match="alpha-list">
<xsl:for-each select="alpha">
<xsl:apply-templates select="../../num-list">
<xsl:with-param name="alpha" select="."/>
</xsl:apply-templates>
</xsl:for-each>
</xsl:template>
<xsl:template match="num-list">
<xsl:param name="alpha"/>
<xsl:for-each select="number">
<alpha-num>
<xsl:copy-of select="$alpha"/>
<xsl:copy-of select="."/>
</alpha-num>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>

0 件のコメント:

コメントを投稿