xoBlos 以外の外部XMLデータの属性を取り込む方法

属性付き外部XMLデータの例 input.xml

<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<Dataset>
  <Record>
    <レストラン名 Star="☆☆">与一衛門</レストラン名>
    <場所>銀座</場所>
  </Record>
  <Record>
    <レストラン名 Star="☆☆☆">画竜点睛</レストラン名>
    <場所>赤坂</場所>
  </Record>
  <Record>
    <レストラン名 Star="☆☆☆">三なすび</レストラン名>
    <場所>麻布</場所>
  </Record>
  <Record>
    <レストラン名 Star="☆☆">アディオス・アミーゴ</レストラン名>
    <場所>恵比寿</場所>
  </Record>
  <Record>
    <レストラン名 Star="☆☆☆">ムーングロウ</レストラン名>
    <場所>中目黒</場所>
  </Record>
</Dataset>

属性をタグ(項目名)に変換する設定

[新しい手順]-[コピー/削除/その他]-[XMLを任意の形式に変換] メニューから「変換(XSLTで)」手順を作成し、ファイル名を設定します。

  入力ファイル名    input.xml

  出力ファイル名    work.xml

  XSLTスタイルシートファイル 属性変換.xml

属性変換.xml の内容

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" encoding="UTF-8" indent="yes" />

  <xsl:template match="/">
    <xsl:apply-templates/>
  </xsl:template>

  <xsl:template match="@*|node()">

    <xsl:if test="name()='レストラン名'">
      <Star><xsl:value-of select="@Star"/></Star>
    </xsl:if>

    <xsl:copy>
      <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>

  </xsl:template>

</xsl:stylesheet>

XSLT変換後の出力結果 work.xml

f:id:xoblos:20211008073512p:plain

xoBlos 用にXMLデータをフラット化する

[新しい手順]-[抽出データを作成する]-[XMLファイルから] メニューから「変換(XML→抽出データ)」手順を作成し、ファイル名を設定します。

  入力ファイル名    work.xml

  出力ファイル名    output.xml

xoBlos 用のフラットなXMLに変換されます。

f:id:xoblos:20211008081504p:plain

ルート要素に属性があるXMLデータのケース

ここまでの例で説明した 属性変換.xml では、ルート要素に指定された属性を変換しようとするとうまくいきません。

出典:e-Govポータル(https://www.e-gov.go.jp

f:id:xoblos:20211009161611p:plain

上図のように、e-Gov 法令XMLデータには、ルート要素 Law に属性が付いています。

例えばこの法令XMLから、属性 Year、Era をタグ(項目名)に変換したい場合、Law をラップした TOP というルート要素を作り、その下に属性を出力すれば良さそうです。

f:id:xoblos:20211009161623p:plain

サンプルXSLTスタイルシートファイルの内容を次に載せます。

属性変換2.xml

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" encoding="UTF-8" indent="yes" />

  <xsl:template match="/">
    <TOP><xsl:apply-templates/></TOP>
  </xsl:template>

  <xsl:template match="@*|node()">

    <xsl:if test="name()='Law'">
      <Year><xsl:value-of select="@Year"/></Year>
      <Era><xsl:value-of select="@Era"/></Era>
    </xsl:if>

    <xsl:copy>
      <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>

  </xsl:template>

</xsl:stylesheet>