• 締切
  • 困ってます

XMLでのデータのリレーションの作り方

  • 質問No.7500080
  • 閲覧数495
  • ありがとう数3
  • 回答数1

お礼率 100% (16/16)

例えば以下のようなXMLデータがあるとします。

"勘定科目マスタ.xml"
<勘定科目マスタ>
<勘定科目情報>
<勘定科目コード>1</勘定科目コード><勘定科目>現金預金</勘定科目>
</勘定科目情報>
<勘定科目情報>
<勘定科目コード>2</勘定科目コード><勘定科目>借入金</勘定科目>
</勘定科目情報>
<勘定科目情報>
<勘定科目コード>3</勘定科目コード><勘定科目>仕入</勘定科目>
</勘定科目情報>
</勘定科目マスタ>

"出金伝票マスタ.xml"
<出金伝票マスタ>
<伝票コード>
<伝票番号>1</伝票番号>
<勘定科目コード>3</勘定科目コード>
<金額>80000</金額>
<摘要>夏物仕入れ</摘要>
</伝票コード>
<伝票コード>
<伝票番号>2</伝票番号>
<勘定科目コード>2</勘定科目コード>
<金額>500000</金額>
<摘要>運転資金借り入れ</摘要>
</伝票コード>
</出金伝票マスタ>

 二つのファイルを結合して勘定科目名も組み込んだ下のような出金伝票情報xmlデータを作り出すには、XMLのどのような技術を使うのが適当なのでしょうか。どうかお教え下さい。

"出金伝票情報.xml"
<出金伝票情報>
<伝票コード 伝票番号="1">
<勘定科目コード>3</勘定科目コード>
<勘定科目>仕入</勘定科目>
<金額>80000</金額>
<摘要>夏物仕入れ</摘要>
</伝票コード>
<伝票コード 伝票番号="2">
<勘定科目コード>2</勘定科目コード>
<勘定科目>借入金</勘定科目>
<金額>500000</金額>
<摘要>運転資金一部返済</摘要>
</伝票コード>
</出金伝票情報>

回答 (全1件)

  • 回答No.1

ベストアンサー率 51% (166/325)

xslt で検索!
補足コメント
seastar3

お礼率 100% (16/16)

とりあえず、ひとつのXMLファイル内に勘定マスタと取引記録とを納めて、勘定マスタから勘定科目名を選び出すコードはできました。XPathを思い通りに指定するのがコツでした。備忘録としてここに載せておきます。

WNode01.xml (勘定マスタノードaccountsと取引記録ノードjournalsを納めるXMLファイル)
- - - - - - - - - - - - - - - - - - - -
<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="WNode01.xsl" ?>
<group1>
<accounts>
<account><acN>1</acN><ac>Cash</ac></account>
<account><acN>5</acN><ac>Loan</ac></account>
<account><acN>20</acN><ac>Stocking</ac></account>
</accounts>

<journals>
<journal>
<jnlN>3</jnlN><acN>5</acN><amount>1000</amount>
</journal>
<journal>
<jnlN>11</jnlN><acN>20</acN><amount>-3000</amount>
</journal>
</journals>
</group1>

- - - - - - - - - - - - - - - - - - - -

WNode01.xsl (取引記録表を表示する際に勘定コードから勘定マスタの勘定科目名を探して表示させるスタイルシートファイル)
- - - - - - - - - - - - - - - - - - - -
<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<html>
<head>
<title>Wノードを使って出納帳出力</title>
</head>
<body bgcolor="lime">
<h1 align="center"><font color="darkviolet">出 納 帳 Wノード用)</font></h1>
<xsl:apply-templates mode="EdtJnl2" />
</body>
</html>
</xsl:template>

<xsl:template match="group1" mode="EdtJnl2">
<center>
<table border="1">
<xsl:for-each select="journals">
<tr align="center">
<th>Journal<br />number</th><th>Account<br />number</th>
<th>Account</th><th>Amount</th>
</tr>
<xsl:for-each select="journal">
<tr>
<td align="center"><xsl:value-of select="jnlN" /></td>
<td align="center"><xsl:value-of select="acN" /></td>
<td><xsl:variable name="VacN" select="acN" />
<xsl:for-each select="/group1/accounts/account[acN=$VacN]">
<xsl:value-of select="ac" />
</xsl:for-each>
</td>
<td align="right"><xsl:value-of select="amount" /></td>
</tr>
</xsl:for-each>
</xsl:for-each>
</table>
</center>
</xsl:template>
</xsl:stylesheet>
投稿日時:2013/02/26 20:50
お礼コメント
seastar3

お礼率 100% (16/16)

dscriptyさん、ご教授どうもありがとうございます。参考サンプルコードにいきあたりました。
xsl内でdocument()関数で別系列のノードとして、リレーション先のXMLコンテンツを展開して、
select = ノード[条件式]/検索ノード といった形式の<xsl:value-of />タグで絞り込むようですね。
まだ、検証していませんが、出来そうな気がします。
かなり長い間、分からなかった技術なので、とても助かりました。ありがとうございます。
投稿日時:2012/05/28 23:21
関連するQ&A

その他の関連するQ&Aをキーワードで探す

ページ先頭へ