Конкретные XML-узлы с использованием XQuery - PullRequest
2 голосов
/ 28 июня 2019

Мне потребовался следующий вывод

<name>Thomas Mapother</name>
<name>Tom Cruise</name>

с использованием приведенного ниже XML с использованием выражений XQuery FLOWR.

INSERT INTO XMLO1 VALUES ('<Contact>
<Names>
    <Name Type = "Legal">
        <First>Thomas</First>
        <Middle>T</Middle>
        <Last>Mapother</Last>
    </Name>
    <Name Type = "Stage">
        <First>Tom</First>
        <Middle>C</Middle>
        <Last>Cruise</Last>
    </Name>
</Names>
</Contact>')

Я попробовал следующий запрос.Но он возвращает другой вывод.

SELECT xDoc.query('let $names := Contact/Names/Name
return <name>{
    for $x in $names
    return ($x/First,$x/Last)}
</name>')
FROM XMLO1

Ответы [ 2 ]

2 голосов
/ 28 июня 2019

Примерно так:

select xDoc.query('
for $x in Contact/Names/Name
return element Name {concat($x/First[1]," ", $x/Last[1])}
')
from XMLO1

Или уничтожить и рекомбинировать (будет быстрее):

select T.X.value('(First/text())[1]', 'nvarchar(100)')+' '+
         T.X.value('(Last/text())[1]', 'nvarchar(100)')
from XMLO1
  cross apply xDoc.nodes('Contact/Names/Name') as T(X)
for xml path('Name');
1 голос
/ 28 июня 2019

Из этого и из Возврат нескольких узлов XML и пользовательского родительского тега с использованием FLWOR XQuery , я думаю, вы немного запутались в том, как работают выражения FLWOR.

В другом вопросевам нужен был только один элемент-обертка (oldPlanes), но вы допустили ошибку, создав элемент внутри предложения return выражения FLWOR, которое выполняется один раз для каждого узла, выбранного предложением for.В этом вопросе вы допустили обратную ошибку: вам нужен один элемент name для каждого Name на входе, поэтому вам нужно сгенерировать его в предложении return.

Таким образом, вместо

return <name>{
    for $x in $names
    return ($x/First,$x/Last)}
</name>

вы хотите

return 
    for $x in $names
    return <name>{($x/First,$x/Last)}</name>

Опять же, его можно упростить до

return $names/<name>{(First,Last)}</name>

Многие люди, приходящие в XQuery из SQL-фона, ошибаются, полагая, чтокаждый запрос должен быть выражением FLWOR.На самом деле, подавляющему большинству запросов не нужны переменные и FLWOR.

...