XML処理における特殊なケースは、空白のみで構成されるテキストノードです。ストリーミング・モードでのXML処理は、空白のみのテキスト・ノード(すなわち、空白のみをコンテンツとする要素)の処理において、非ストリーミング・モードとは異なる動作をする可能性があります。
空白のみのテキストノードは、デフォルトではストリーミングモードではなく、非ストリーミングモードで処理されます。XQuery 最適化の対象となるクエリについては、ALLOW_XML_TEXT_NODE_WHITESPACE
コマンド・オプションを使用して手動で構成できます。これはブーリアン関数で、2つの値のどちらかを持つことができます:
Value | Default for | Description |
---|---|---|
| XML processing with XQuery streaming optimization | Content of element is removed, and it becomes an empty element |
| XML processing without XQuery streaming optimization | Content of element is left unchanged |
以下の最初の例では、ストリーミングモードの場合、XMLパーサーは先頭や末尾の空白を削除せず、文字列内の複数の空白も削除しません。パーサは空白のみで構成されるテキスト・ノードを削除します:
SELECT
xt.
name
, xt.surname, LENGTH(xt.surname)
FROM
XMLTABLE(
'/root/band_members/band_member'
PASSING XMLPARSE(DOCUMENT
'<?xml version="1.0" encoding="UTF-8"?>
<root>
<band_members>
<band_member>
<name>George does not stream</name>
<surname> starts with a space, ends with a space </surname>
</band_member>
<band_member>
<name>Paul does not stream</name>
<surname>we have three - - spaces here inside the string</surname>
</band_member>
<band_member>
<name>Ringo does not stream.</name>
<surname> </surname>
</band_member>
</band_members>
</root>'
)
COLUMNS
name
STRING PATH
'name'
,
surname STRING PATH
'surname'
) xt
/**
* Outcome:
*
"George does not stream"
,
" starts with a space, ends with a space "
, 40
*
"Paul does not stream"
,
"we have three - - spaces here inside the string"
, 49
*
"Ringo does not stream."
,
""
, 0
*/
ALLOW_XML_TEXT_NODE_WHITESPACE
コマンドオプションを指定し、FALSE を設定して同じクエリを再実行すると、3つ目のエントリについて異なる結果が返されます。
SELECT
xt.
name
, xt.surname, LENGTH(xt.surname)
FROM
XMLTABLE(
'/root/band_members/band_member'
PASSING XMLPARSE(DOCUMENT
'<?xml version="1.0" encoding="UTF-8"?>
<root>
<band_members>
<band_member>
<name>George does not stream</name>
<surname> starts with a space, ends with a space </surname>
</band_member>
<band_member>
<name>Paul does not stream</name>
<surname>we have three - - spaces here inside the string</surname>
</band_member>
<band_member>
<name>Ringo does not stream.</name>
<surname> </surname>
</band_member>
</band_members>
</root>'
)
COLUMNS
name
STRING PATH
'name'
,
surname STRING PATH
'surname'
) xt
OPTION
$ALLOW_XML_TEXT_NODE_WHITESPACE
TRUE
/**
* Outcome:
*
"George does not stream"
,
" starts with a space, ends with a space "
, 40
*
"Paul does not stream"
,
"we have three - - spaces here inside the string"
, 49
*
"Ringo does not stream."
,
" "
, 3
*/
非ストリーミングモードを使用する場合、姓はすべてのケースで空の要素になり、TRUE
またはFALSE
のどちらかをALLOW_XML_TEXT_NODE_WHITESPACE
に渡しても何の効果もありません:
SELECT
xt.
name
, xt.surname, LENGTH(xt.surname)
FROM
XMLTABLE(
'/root/band_members/band_member[3]/surname'
PASSING XMLPARSE(DOCUMENT
'<?xml version="1.0" encoding="UTF-8"?>
<root>
<band_members>
<band_member>
<name>George does not stream</name>
<surname> starts with a space, ends with a space </surname>
</band_member>
<band_member>
<name>Paul does not stream</name>
<surname>we have three- -spaces here inside the string</surname>
</band_member>
<band_member>
<name>Ringo does not stream.</name>
<surname> </surname>
</band_member>
</band_members>
</root>'
)
COLUMNS
name
STRING PATH
'../name'
,
surname STRING PATH
'.'
) xt
/**
* Outcome:
*
"Ringo does not stream."
,
" "
, 3
*/