BLOGTIMES
2014/06/06

XSLT によるルックアップテーブルの実現

  xml 
このエントリーをはてなブックマークに追加

XSL で簡単なルックアップテーブルを実現しようとしたら、思ったより苦戦してしまったので忘れないうちにやり方をメモ。
今回やりたかったのは、下記のような2つの XML (item.xml, lookup.xml) があった場合に、これらをまとめて一つの XML に出力するというもの。

item.xml

<root> <item id="a" /> <item id="b" /> <item id="c" /> <item id="d" /> </root>

lookup.xml

<record_set> <record id="a">1111</record> <record id="b">2222</record> <record id="c">3333</record> <record id="d">4444</record> <record_set>

result.xml

<root> <item id="a" name="1111"/> <item id="b" name="2222"/> <item id="c" name="3333"/> <item id="d" name="4444"/> </root>

以下、作業メモ。

ルックアップテーブルを xsl ファイルに内臓しようとしたら・・・

今回はルックアップテーブルが小さいので、ポータビリティのために xsl 内にルックアップテーブルを内臓しようとしたのですが、そのせいで思ったより苦戦する羽目になってしまいました。xsl から、そのファイル自体を参照するためには document('') を使うことができますが、うまくルックアップを行うためにはきちんと xmlns を宣言しておく必要があるようです。

lookup.xsl

<?xml version='1.0' encoding='UTF-8'?> <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:lookup="example.lookup" exclude-result-prefixes="lookup" > <xsl:output media-type="text/xml; charset=UTF-8" encoding="UTF-8"/> <xsl:template match="/"> <root> <xsl:apply-templates /> </root> </xsl:template> <xsl:template match="item"> <item> <xsl:copy-of select="@*" /> <xsl:attribute name="name"> <xsl:value-of select="document('')/*/lookup:record_set/record[@id=current()/@id]/text()"/> </xsl:attribute> </item> </xsl:template> <lookup:record_set> <record id="a">1111</record> <record id="b">2222</record> <record id="c">3333</record> <record id="d">4444</record> </lookup:record_set> </xsl:stylesheet>

    トラックバックについて
    Trackback URL:
    お気軽にどうぞ。トラックバック前にポリシーをお読みください。[policy]
    このエントリへのTrackbackにはこのURLが必要です→https://blog.cles.jp/item/6770
    Trackbacks
    このエントリにトラックバックはありません
    Comments
    愛のあるツッコミをお気軽にどうぞ。[policy]
    古いエントリについてはコメント制御しているため、即時に反映されないことがあります。
    コメントはありません
    Comments Form

    コメントは承認後の表示となります。
    OpenIDでログインすると、即時に公開されます。

    OpenID を使ってログインすることができます。

    Identity URL: Yahoo! JAPAN IDでログイン