如何找到
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',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
怎么运行的:
> for $i in .
子句定义了一个包含当前节点(.)的名为$i的变量.这基本上是一个解决XQuery缺乏像XSLT的current()函数的破解.
> ../*表达式选择当前节点的所有兄弟节点(父节点的子节点).
> [. << $i]谓词将兄弟姐妹列表过滤到(<<
)当前节点($i)之前的列表.>我们计数()先前的兄弟姐妹的数量,然后加1以获得位置.这样,第一个节点(没有先前的兄弟姐妹)被分配一个位置1.