直積を求める XSLT を書いてみる。SQL の SELECT で FROM に複数テーブルを書いて JOIN せずに置くと出来てくる、こんな感じのあれ。
以下のような 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 件のコメント:
コメントを投稿