XML 処理関数

XML 処理関数は、xml 型の値を作成および変換します。

Virtual DataPort でサポートされている XML 関数

XMLQUERY

説明

XMLQUERY 関数は、XQuery 言語 (XML クエリ (XQuery)) を使用して XML ドキュメントから情報を抽出します。

構文

XMLQUERY( <XQuery expression:text>, <is XQuery file:boolean> ):xml

XMLQUERY( <XQuery expression:text>, <is XQuery file:boolean>, <xml value:xml> ):xml

XMLQUERY( <XQuery expression:text>, <is XQuery file:boolean>, <xml value:text> , <is XML file:boolean> ):xml
  • XQuery expression: xml データのクエリに使用する XQuery 式。

  • is XQuery file: パラメーター「XQuery expression」が XQuery 式を含むファイルのパスである場合は True。「XQuery expression」がリテラルであるか、または式を含むフィールドの名前である場合は False。

  • xml value: 操作する XML。

  • is XML File: パラメーター「xml value」が XML ドキュメントを含むファイルのパスである場合は True。「is XML File」が false であるか、指定されていない場合、「xml value」はリテラルまたは XML フィールドの名前になります。

「xml」型の 1 列と 1 行のみが含まれるビュー V について考えてみます。

books_xml

<BOOKLIST xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
   <BOOKS>
      <ITEM CAT="MMP">
         <TITLE>Pride and Prejudice</TITLE>
         <AUTHOR>Jane Austen</AUTHOR>
         <PUBLISHER>Modern Library</PUBLISHER>
      </ITEM>
      <ITEM CAT="P">
         <TITLE>Wuthering Heights</TITLE>
         <AUTHOR>Emily Brontë</AUTHOR>
         <PUBLISHER>Penguin Classics</PUBLISHER>
      </ITEM>
    </BOOKS>
    <CATEGORIES DESC="Miscellaneous categories">
        <CATEGORY CODE="P" DESC="Paperback"/>
        <CATEGORY CODE="MMP" DESC="Mass-market Paperback"/>
        <CATEGORY CODE="H" DESC="Hard Cover"/>
   </CATEGORIES>
</BOOKLIST>

ビュー V と同じ内容のファイル C:/books_info.xml について考えてみます。

次の XQuery 式を含むファイル C:/books.xq について考えてみます。

<ul>
   {
   for $b in //BOOKS/ITEM
   order by $b/TITLE return
   <li>
      <i> { string($b/TITLE) } </i> by { string($b/AUTHOR) }
   </li>
   }
</ul>

さらに、ファイル C:/books_info.xml の XML ドキュメントを変換する XQuery 式を含むファイル C:/books2.xq について考えてみます。

<ul>
   {
   for $b in doc('c:/books_info.xml')//BOOKS/ITEM
   order by $b/TITLE return
   <li>
     <i> { string($b/TITLE) } </i> by { string($b/AUTHOR) }
   </li>
   }
</ul>

例 1

以下のクエリは同じ結果になります。

クエリ 1

SELECT XMLQUERY('
<ul>
   {
   for $b in doc(''C:/books_info.xml'')//BOOKS/ITEM
   order by $b/TITLE return
    <li>
        <i> { string($b/TITLE) } </i> by { string($b/AUTHOR) }
    </li>
   }
</ul>', false)
FROM Dual();

クエリ 2

SELECT XMLQUERY ('C:/books2.xq', true)
FROM Dual();

クエリ 3

SELECT XMLQUERY('<ul>
{
for $b in //BOOKS/ITEM
order by $b/TITLE return
<li>
<i> { string($b/TITLE) } </i> by { string($b/AUTHOR) }
</li>
}
</ul>', false, booksxml)
FROM xQuery_sample_view;

クエリ 4

SELECT XMLQUERY('C:/books.xq', true, booksxml, false)
FROM xQuery_sample_view

xmlquery

<ul>
  <li>
    <i>Pride and Prejudice</i> by Jane Austen
  </li>
  <li>
    <i>Wuthering Heights</i> by Emily Brontë
  </li>
</ul>

「クエリ 1」では XQuery 式をパラメーターとして渡し、「クエリ 2」ではパラメーターは同じ式を含むファイルのパスです。そのため、「クエリ 2」の 2 番目のパラメーターは true になります。この式は、ファイル「C:/books_info.xml」の内容を読み取ります。

「クエリ 3」と「クエリ 4」では、XML ドキュメントがビュー V のフィールド booksxml から取得されます。

XPATH

説明

XPATH 関数は、XPath 式 (XPath 言語) によって選択された XML ドキュメントからノードを返します。

この関数は、W3C によって定義されている基本的な適合性レベルで XPath 2.0 をサポートしています。つまり、この関数はスキーマ認識を必要としないすべての XPath 機能を備えています。

構文

XPATH( <xml value:xml>, <XPath expression:text> [, <xml header:boolean> ]):xml
  • xml value: 必須。XPath 式を適用する XML データ型。

  • XPath expression: 必須。XPath 式。

  • xml header: オプション。これが true で、選択された値が XML ノードの場合、結果には XML 宣言 (<?xml version="1.0"...) が含まれます。これが false であるか、選択した値が XML ノードでない場合、結果にこの宣言は含まれません。

この関数が Oracle、DB2、または SQL Server のデータベースに委任された場合、パラメーター xml header は無視され、この関数は XPath 式の適用結果のみを返します。

例 1

SELECT XPATH ( CAST ('xml' ,
'<?xml version="1.0" encoding="ISO-8859-1"?>
<a>
<b>Hello</b>
<b>World</b>
</a>' ) , '/a/b', true) as xpath_results
FROM Dual();

xpath_results

<?xml version="1.0" encoding="UTF-8"?><b>Hello</b><b>World</b>

例 2

SELECT xpath ( cast ('xml' ,
'<?xml version="1.0" encoding="ISO-8859-1"?>
<a>
<b>Hello</b>
<b>World</b>
</a>' ) , '/a/b/text()', true) as xpath_results
FROM Dual();

xpath_results

HelloWorld

例 3

SELECT xpath ( cast ('xml',
'<?xml version="1.0" encoding="ISO-8859-1"?>
<a>
<b>Hello</b>
<b>World</b>
</a>' ) , '/a/b/text()', false) as xpath_results
FROM Dual();

xpath_results

HelloWorld

パラメーター xml header の値は「例 2」では true 、「例 3」では false ですが、「例 2」と「例 3」の結果は同じです。その理由は、XPath 関数の結果が XML ドキュメントではないためです。

XSLT

説明

XSLT 関数は、XML に XSL 変換を適用した結果を返します。

構文

XSLT( <XML value:xml>, <XSL value:xml> ):xml

XSLT( <XML value:{xml\|text}>, <xslValue:{xml\|text}>, [, <is path to XML:boolean> ] [, <is path to XSLT:boolean> ]:xml
  • XML value: 必須。XML リテラル、変換する XML フィールドまたは XML ファイル。

  • XSL value: 必須。XSL リテラル、XSL を含むフィールド、または XSL を含むファイル。

  • is path to XML: xml value の型が text の場合にのみ必須。 xml value が xml ファイルのパスの場合は true 。それ以外の場合は false

  • is path to XSLT: XSL value の型が text の場合にのみ必須。これが XSL ファイルのパスの場合は true 。それ以外の場合は false

ビュー V について考えてみます。

xml_sample

xsl_sample

  <?xml version='1.0'
  encoding='UTF-8'?>
  <shop>
  <products>
    <product>
      <id>1</id>
      <name>Virtual DataPort</name>
    </product>
    <product>
      <id>2</id>
      <name>ITPilot</name>
    </product>
    <product>
      <id>3</id>
      <name>Scheduler</name>
    </product>
  </products>
</shop>
<?xml version='1.0'
encoding='UTF-8'?>
<xsl:transform version='1.0'
xmlns:xsl='http://www.w3.org/1999/
XSL/Transform'>

<xsl:template match='/shop/products'>
  <shop>
    <xsl:for-each select='product'>
      <product>
        <xsl:value-of select='name'/>
      </product>
    </xsl:for-each>
  </shop>
</xsl:template>
</xsl:transform >

例 1

SELECT XSLT(xml_sample, xsl_sample, false, false)
FROM V

xslt

<?xml version="1.0" encoding="UTF-8"?>
<shop>
  <products>
    <product>Virtual DataPort</product>
    <product>ITPilot</product>
    <product>Scheduler</product>
  </products>
</shop>

以下のクエリでも同じ結果を取得できます。

SELECT XSLT(xml_sample, CAST('xml', xsl_sample), false)
FROM V
SELECT XSLT(CAST('xml', xml_sample), xsl_sample, false)
FROM V
SELECT XSLT(CAST('xml', xml_sample), CAST('xml', xsl_sample))
FROM V

例 2

XSL ファイル books.xsl を使用してファイル books.xml を変換します。最後の 2 つのパラメーターは、1 番目と 2 番目のパラメーターがファイルのパスであることを示しています。

SELECT XSLT ('../test/xml/books.xml', '../test/xml/books.xsl', true, true)
FROM V

例 3

XSL ファイル books.xsl を使用して、列 xml_sample のセルを変換します。

SELECT XSLT (CAST ('xml', xml_sample), '../test/xml/books.xsl', true)
FROM V

例 4

xsl_sample の XSL を使用してファイル books.xml を変換します。

SELECT XSLT ('../test/xml/books.xml', CAST ('xml', xsl_sample), true)
FROM V

Virtual DataPort 複合型への XML データの変換

CAST 関数と CREATETYPEFROMXML 関数を組み合わせることで、XML データからビュー内に複合型 (register または array) のフィールドを作成できます。

注釈

関数 CREATETYPEFROMXML は非推奨であり、Denodo Platform の将来のバージョンでは削除される可能性があります。代わりに、型のルートを持つ XML データソースを 変数から 作成し、その XML ドキュメントをこのデータソースに渡してください。

例: PERSONAL_DATA_XML という xml 型のフィールドを含むビュー V があるとします。このフィールドに含まれるデータは、次の構造になっています。

<person>
    <name> </name>
    <age> </age>
</person>

この場合に次の式について考えてみましょう。

CREATE VIEW PERSON AS
    SELECT CAST(
        CREATETYPEFROMXML(
              'personaldata_type'
            , '<person><name> John Smith </name><age>25</age></person>'
        ), PERSONAL_DATA_XML
    ) PERSONALDATA
FROM V

新しいビュー PERSON の派生フィールド PERSONALDATA の型は personaldata_type です。この型は、フィールド name (text 型) および age (long 型) で構成される register 型です。

CREATETYPEFROMXML 関数の 2 番目のパラメーターは、ビュー VPERSONAL_DATA_XML フィールドに含まれる値の例である必要があります。

CREATETYPEFROMXML は array 型を作成することもできます。これは、1 番目のパラメーターに XML データを渡し、2 番目のパラメーターで同じエレメントを繰り返した場合に該当します。次に例を示します。

<titles>
   <title lang="en"> </title>
   <title lang="en"> </title>
</titles>

この場合、 CREATETYPEFROMXML によって作成される型は配列のレジスターです。配列の各コンポーネントは、2 つのコンポーネント titlelang が含まれる 1 つのレジスターです。

XML 型データを Virtual DataPort 複合型データに変換することで、XML コード内のデータを他のリレーションからのデータと組み合わせることができます。たとえば、 age (long 型) および risk (double 型) の 2 つのフィールドが含まれるビュー RISK_LEVEL があり、そこに個人の年齢に従って計算された何らかのタイプのリスクインデックスが含まれるとします。 RISK_LEVELage フィールドと PERSON ビューの PERSONALDATA フィールドの age フィールドを使用して、 PERSON ビューと RISK_LEVEL ビューの間で結合操作を実行できます。