如何找到 XML 文档中节点的顺序?
我拥有的是这样的文档:
<value code="1">
<value code="11">
<value code="111"/>
</value>
<value code="12">
<value code="121">
<value code="1211"/>
<value code="1212"/>
</value>
</value>
</value>
我试图将这个东西放入一个定义如下的表中
CREATE TABLE values(
code int,
parent_code int,
ord int
)
保留 XML 文档中值的顺序(它们不能按代码排序)。我希望能够说
SELECT code
FROM values
WHERE parent_code = 121
ORDER BY ord
确定性地,结果应该是
code
1211
1212
我努力了
SELECT
value.value('@code', 'varchar(20)') code,
value.value('../@code', 'varchar(20)') parent,
value.value('position()', 'int')
FROM @xml.nodes('/root//value') n(value)
ORDER BY code desc
但它不接受position()
功能 ('position()
' 只能在谓词或 XPath 选择器中使用)。
我想以某种方式是可能的,但是如何呢?
您可以模仿position()
函数通过计算每个节点之前的兄弟节点的数量:
SELECT
code = value.value('@code', 'int'),
parent_code = value.value('../@code', 'int'),
ord = value.value('for $i in . return count(../*[. << $i]) + 1', 'int')
FROM @Xml.nodes('//value') AS T(value)
这是结果集:
code parent_code ord
---- ----------- ---
1 NULL 1
11 1 1
111 11 1
12 1 2
121 12 1
1211 121 1
1212 121 2
怎么运行的:
- The for $i in . http://msdn.microsoft.com/en-us/library/ms190945.aspx子句定义了一个名为
$i
包含当前节点(.
)。这基本上是一个解决 XQuery 缺乏类似 XSLT 的问题的 hackcurrent()
功能。
- The
../*
表达式选择当前节点的所有兄弟节点(父节点的子节点)。
- The
[. << $i]
谓词将兄弟姐妹列表过滤为 (<< http://msdn.microsoft.com/en-us/library/ms190935.aspx) 当前节点 ($i
).
- We
count()
前面的兄弟姐妹的数量,然后加 1 以获得位置。这样,第一个节点(没有前面的兄弟节点)的位置就被分配为 1。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)