XQuery
MarkLogic

【MarkLogic Server】XQueryでノードの要素名と値、属性を動的に設定する方法

More than 1 year has passed since last update.

はじめに

XQueryでXMLのノードを生成する時、外部ファイルなどから取得した内容を要素名や値、属性として設定したい場合があります。
XQueryでノードの要素名と値、属性を動的に設定する方法を紹介します。

概要

MarkLogicのXQueryでノードの要素名と値、属性を動的に設定する方法を記載します。

対象MarkLogicバージョン
8.0-6

内容

ノードの記述は計算コンストラクタの「element」を利用します。
計算コンストラクタの「element」は以下のように記述することで要素ノードが生成されます。

element <要素名> {"値"}

例:root要素内に"123"の値を持つtest要素を設定します。

element root {
  element test {
    "123"
  }
}

上記XQueryを実行した結果は以下となります。

<root>
 <test>123</test>
</root>

動的に要素名や値を設定したい場合、
以下のようにlet句で設定したい要素名と値を変数に保持し、保持した内容を「element」に設定します。
変数の値を変更することで、動的に要素名と値を変更することが可能になります。

let $tagNameRoot := "root"
let $tagNameTest := "test"
let $value := "123"

(: 要素ノードを返却(xs:QName()での型変換は省略可能) :)
return element {xs:QName($tagNameRoot)} {
                  element {xs:QName($tagNameTest)} {
                    $tagNameTest
                  }
                }

上記XQueryを実行した結果は以下となります。

<root>
 <test>123</test>
</root>

利用例

利用例を記載します。

  • 実装内容

CSVファイル(InputFile.csv)を読み込み、各行の要素名と値で要素ノードを生成します。
また、各要素ノードには属性を定義します。
生成した要素ノードをroot要素内に設定し、その結果をXMLファイル(OutputFile.xml)に出力します。

  • 入力ファイル

入力ファイルの内容は以下になります。Tag1~Tag3を要素名、Value1~Value3を値とします。

InputFile.csv
Tag1,Value1
Tag2,Value2
Tag3,Value3
  • XQuery

XQueryは以下のように記述します。
属性の生成は計算コンストラクタの「attribute」を利用します。

(: CSVファイルの読み込み :)
let $csvFile := fn:doc("/InputFile.csv")

let $node :=
  (: 読み込んだCSVファイルを1行ずつ処理 :)
  for $line in fn:tokenize($csvFile,"\n")
    (: カンマ区切りで配列に変換 :)
    let $array := fn:tokenize($line,",")
    (: 要素名を保持 :)
    let $tagName := $array[1]
    (: 値を保持 :)
    let $value := $array[2]
    (: 属性名を保持 :)
    let $attributeName := "id"
    (: 属性値を保持 :)
    let $attributeValue := fn:concat("id_",$array[2])
    (: ノードを返却 :)
    return element {xs:QName($tagName)} {
                      (: 属性ノードを生成 :)
                      attribute {xs:QName($attributeName)} {
                                    $attributeValue
                                },
                      $value
                    }

(: root要素内に処理結果を設定 :)
let $tagNameRoot := "root"
let $ret := element {xs:QName($tagNameRoot)} {$node}

(: XMLファイルを出力し終了 :)
return xdmp:document-insert("/OutputFile.xml",$ret)
  • 出力ファイル

XQuery実行後、以下のファイルが出力されます。

OutputFile.xml
<?xml version="1.0" encoding="UTF-8" ?>
<root>
 <Tag1 id="id_Value1">Value1</Tag1>
 <Tag2 id="id_Value2">Value2</Tag2>
 <Tag3 id="id_Value3">Value3</Tag3>
</root>

おわりに

計算コンストラクタは要素ノードを生成する「element」や属性ノードを生成する「attribute」の他に、コメントノードを生成する「comment」やテキストノードを生成する「text」などがあります。
コメントノードやテキストノードなども動的に値を設定できるためとても便利です。

\def\textsmall#1{%
  {\rm\scriptsize #1}
}

免責事項

​​​​​$\textsmall{当ユーザ会は本文書及びその内容に関して、いかなる保証もするものではありません。}$
​​​​​$\textsmall{万一、本文書の内容に誤りがあった場合でも当ユーザ会は一切責任を負いかねます。}$
​​​​​$\textsmall{また、本文書に記載されている事項は予告なしに変更または削除されることがありますので、予めご了承ください。}$