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') xtOPTION $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*/