XML 関数¶
XML 関数は、 xml 型の値を作成および変換します。
次の関数が 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 フィールドの名前になります。
XQuery 式では、デフォルトで ftp、file、http などの任意のプロトコルを使用できます。この動作を制限するには、使用可能なスキーマのカンマ区切りリストをプロパティ com.denodo.vdb.server.xmlFunctions.allowedProtocols に設定します。以下に例を示します。
SET 'com.denodo.vdb.server.xmlFunctions.allowedProtocols'='file, http';
すべてのプロトコルを無効にするには、以下を実行します。
SET 'com.denodo.vdb.server.xmlFunctions.allowedProtocols'='';
すべてのプロトコルを有効にするには、以下を実行します。
SET 'com.denodo.vdb.server.xmlFunctions.allowedProtocols'='all';
例
「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 番目のパラメータは、ビュー V の PERSONAL_DATA_XML フィールドに含まれる値の例である必要があります。
CREATETYPEFROMXML は array 型を作成することもできます。これは、1 番目のパラメータに XML データを渡し、2 番目のパラメータで同じエレメントを繰り返した場合に該当します。次に例を示します。
<titles>
<title lang="en"> </title>
<title lang="en"> </title>
</titles>
この場合、 CREATETYPEFROMXML によって作成される型は配列のレジスターです。配列の各コンポーネントは、2 つのコンポーネント title と lang が含まれる 1 つのレジスターです。
XML 型データを Virtual DataPort 複合型データに変換することで、XML コード内のデータを他のリレーションからのデータと組み合わせることができます。たとえば、 age (long 型) および risk (double 型) の 2 つのフィールドが含まれるビュー RISK_LEVEL があり、そこに個人の年齢に従って計算された何らかのタイプのリスクインデックスが含まれるとします。 RISK_LEVEL の age フィールドと PERSON ビューの PERSONALDATA フィールドの age フィールドを使用して、 PERSON ビューと RISK_LEVEL ビューの間で結合操作を実行できます。
