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
ビューの間で結合操作を実行できます。