XML処理における特殊なケースは、空白のみで構成されるテキストノードです。ストリーミング・モードでのXML処理は、空白のみのテキスト・ノード(すなわち、空白のみをコンテンツとする要素)の処理において、非ストリーミング・モードとは異なる動作をする可能性があります。

空白のみのテキストノードは、デフォルトではストリーミングモードではなく、非ストリーミングモードで処理されます。XQuery 最適化の対象となるクエリについては、ALLOW_XML_TEXT_NODE_WHITESPACEコマンド・オプションを使用して手動で構成できます。これはブーリアン関数で、2つの値のどちらかを持つことができます:

Value

Default for

Description

FALSE

XML processing with XQuery streaming optimization

Content of element is removed, and it becomes an empty element

TRUE

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
*/