- - PR -
XSLTでXMLを正規化されたDB表のように使いたい
1
投稿者 | 投稿内容 |
---|---|
|
投稿日時: 2003-09-11 19:00
お疲れさまです。
xml+xsltでわからないことがあるのです。 ------------------ xml -------------------- <dataset> <list1> <address position="あっち" tel="110">yokohama</address> <address position="こっち" tel="104">osaka</address> <address position="そっち" tel="110">tokyo</address> </list1> <list2> <people> <name>サップ</name> <address>tokyo</address> </people> <people> <name>佐竹</name> <address>osaka</address> </people> <people> <name>羽山</name> <address>osaka</address> </people> <list2> </dataset> ----------------------------------------- このような2つに正規化?されたデータ集合で、片方(=人間)の 表を作りつつ、addressが合致するlist2要素の属性を拾ってくる ことはできるでしょうか? 要は、同じデータを複数持ちたくないのです。(この場合はtel) --------------------- xsl -------------------------- <xsl:for-each select="list2"> <tr> <td><xsl:value-of select="name" /></td> <td><xsl:value-of select="../list1[@@@@@]/address/@tel" /></td> </tr> </xsl:for-each> ---------------------------------------------------- こんな感じで、[@@@@@]の部分を色々と試してみたのですが、うま くできませんでした。 [../list1/address=address] こんな感じの構文でできるのでしょうか? それとも、もっと工夫が必要なのでしょうか? |
|
投稿日時: 2003-09-12 09:00
for-eachはあまり使ったことがないので、templateで変換
してみました。以下のような結果でよいのでしょうか? --------------------- 結果 -------------------------- サップ 110 佐竹 104 羽山 104 --------------------- 結果 -------------------------- --------------------- xsl -------------------------- <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="/"> <table> <xsl:apply-templates select="dataset/list2/people"/> </table> </xsl:template> <xsl:template match="people"> <xsl:variable name="addr" select="address"/> <tr> <td><xsl:value-of select="name"/></td> <td><xsl:value-of select="//list1/address[. = $addr]/@tel" /></td> </tr> </xsl:template> </xsl:stylesheet> --------------------- xsl -------------------------- for-eachでも、繰り返しの対象をpeopleにすれば同じよう な結果が得られると思います。 もっと良い方法もあるかと思いますが、とりあえずご参考 までに。 |
|
投稿日時: 2003-09-12 09:15
>悠氏
レスありがとうございます。 いい感じです、助かりました。 最近xslt始めたのですが、結構面白くて使いでがありそうだな、 と感じています。 次は、このxmlをSAXで通そうと思っています。 ではでは、ありがとうございました。 |
1