Voici mon approche XML noob.
Si vous faites confiance que l'enchaînement des éléments, et non pas les valeurs elles-mêmes coordonnées étant une séquence:
select
coordinate = max(case when element = 'coordinate' then elemval end)
, value = max(case when element = 'Value' then elemval end)
from (
select
element = row.value('local-name(.)','varchar(32)')
, elemval = row.value('.','int')
, position = row.value('for $s in . return count(../*[. << $s]) + 1', 'int')
from @xml.nodes('/myroot/scene/item/*/*') a (row)
) a
group by position
Vous pouvez également écrit deux .nodes()
et un JOIN
(vous voyez l'idée).
Si la confiance avez-vous les coordonnées de numérotation à une séquence à partir de zéro:
select
coordinate = row.value('for $s in . return count(../*[. << $s]) + 1', 'int')
- 1
, value = row.value('.','int')
from @xml.nodes('/myroot/scene/item/Values/*') a (row)
Si vous faites confiance que la coordonnée de numérotation à une séquence, mais à partir d'une graine arbitraire:
select
coordinate = row.value('for $s in . return count(../*[. << $s]) + 1', 'int')
+ row.value('(/myroot/scene/item/coordinates/coordinate)[1]','int')
- 1
, value = row.value('.','int')
from @xml.nodes('/myroot/scene/item/Values/*') a (row)
Les chemins peuvent être abrégés:
/myroot/scene/item/*/*
->//item/*/*
/myroot/scene/item/Values/*
->//Values/*
/myroot/scene/item/coordinates/coordinate
->//coordinate
Mais je ne sais pas la sagesse de cette toute façon.
//item/*/*
peut probablement être rendu plus spécifique, de sorte qu'il ne comprend que coordinate
et Value
nœuds de bord, mais je ne connais pas la syntaxe.
Où le document XML est-il stocké? – annakata