Как разобрать упорядоченный список XML в табличное представление - PullRequest
0 голосов
/ 23 октября 2019

Как разобрать Упорядоченный список XML вот так

<ol>
  <li>value1</li>
  <li>value2</li>
  <li>value3</li>
</ol>

в таблицу вот так (как это видно в html):

Nr          Value
----------- ------
1           value1
2           value2
3           value3

Вот код для строки XML:

declare @ol XML= '<ol><li>'+REPLACE('value1,value2,value3', ',', '</li><li>')+'</li></ol>' 
select  @ol

NB! Можно ли проанализировать "нумерацию" из XML, не создавая что-то вроде identity столбца?

Небольшое обновление: Следующие решения дают правильный ответ для простого примера выше:

  1. Ицхак Хабинский, Салман A
  2. Ахилеш Сингх

Но возможно ли получить решение для этого более хитрого примера:

DECLARE @ol XML 
SET @ol= 
'<ol type="i" start="3">
  <li>value1</li>
  <li>value2</li>
  <li>value3</li>
</ol>';

Расчетный результат:

Nr   Value
---- -------
iii  value1
iv   value2
v    value3

?

Ответы [ 2 ]

2 голосов
/ 23 октября 2019

Найти узлы легко, найти их относительное положение довольно сложно. Вот одно из решений, использующее то, что называется Операция сравнения узлов через оператор << и функцию count:

DECLARE @ol XML = '<ol>
  <li>value1</li>
  <li>value2</li>
  <li>value3</li>
</ol>';
SELECT li.value('.', 'NVARCHAR(100)') AS value
     , li.value('let $n := . return count(../*[. << $n]) + 1', 'int') AS pos
FROM @ol.nodes('/ol/li') AS x(li)
0 голосов
/ 23 октября 2019
DECLARE @ol XML 
SET @ol= '<ol>
  <li>value1</li>
  <li>value2</li>
  <li>value3</li>
</ol>';

SELECT  ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS Nr,
li.value('.', 'NVARCHAR(100)') AS Value
FROM @ol.nodes('/ol/li') AS x(li)

Попробуйте этот простой запрос ... здесь ... Получение номера строки () ... поэтому мы получаем Nr как число ... 1,2,3..so on ... и значение xml втаблица ....

Вы получите этот тип вывода ...

Вывод:

Nr          Value
----------- ------
1           value1
2           value2
3           value3

После редактирования вашего вопроса .. . Решение должно быть следующим: .....

DECLARE @ol XML 
SET @ol= 
'<ol type="i" start="3">
  <li>value1</li>
  <li>value2</li>
  <li>value3</li>
</ol>';

SELECT 2 + ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS Nr,
li.value('.', 'NVARCHAR(100)') AS Value
FROM @ol.nodes('/ol/li') AS x(li)

Вывод:

Nr          Value
----------- ------
3           value1
4           value2
5           value3

здесь добавление значения +2 к RowNumber (), так что .. ... мы можем получить значение 2,3,4 ... и так далее ..

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...