Xml xquery---使用与当前节点不同的值访问下一个节点
这是我正在使用的xml,我正在尝试输入我遇到的第一个不同pd值的id号Xml xquery---使用与当前节点不同的值访问下一个节点,xml,xpath,xquery,Xml,Xpath,Xquery,这是我正在使用的xml,我正在尝试输入我遇到的第一个不同pd值的id号 <result> <pd>a</pd> <id>1</id> <pd>a</pd> <id>2</id> <pd>b</pd> <id>8</id> <pd>c</pd> <id>9</id&g
<result>
<pd>a</pd>
<id>1</id>
<pd>a</pd>
<id>2</id>
<pd>b</pd>
<id>8</id>
<pd>c</pd>
<id>9</id>
<pd>c</pd>
<id>4</id>
<pd>d</pd>
<id>7</id>
</result>
A.
1.
A.
2.
B
8.
C
9
C
4.
D
7.
因此,我期望的结果是:
<pd>a</pd>
<id>1</id>
<pd>b</pd>
<id>8</id>
<pd>c</pd>
<id>9</id>
<pd>d</pd>
<id>7</id>
a
1.
B
8.
C
9
D
7.
我使用了以下同级::*[2]访问下一个pd并将其与当前节点进行比较,但它只给出了b,而不是c和d。你们谁能给我一个提示,告诉我如何遍历整个xml以获得所需的输出?谢谢 可能有更优雅的解决方案,但我采取的策略是收集pd元素中的所有不同值,然后循环遍历所有pd元素,并获取pd元素中的值与不同值当前迭代中的值匹配的第一个同级
for $distinct-pd in fn:distinct-values($xml//pd)
for $pd in $xml//pd[./text() eq $distinct-pd][1]
return ($pd, $pd/following-sibling::*[1])
对于您的代码,这将产生
<pd>a</pd>
<id>1</id>
<pd>b</pd>
<id>8</id>
<pd>c</pd>
<id>9</id>
<pd>d</pd>
<id>7</id>
<pd>a</pd>
<id>1</id>
<pd>b</pd>
<id>8</id>
<pd>c</pd>
<id>9</id>
<pd>d</pd>
<id>7</id>
a
1.
B
8.
C
9
D
7.
实现同样效果的另一种方法——对于不太长的序列来说足够好:
/*/pd[not(. = preceding-sibling::pd)]
/(.|following-sibling::id[1])
<result>
<pd>a</pd>
<id>1</id>
<pd>a</pd>
<id>2</id>
<pd>b</pd>
<id>8</id>
<pd>c</pd>
<id>9</id>
<pd>c</pd>
<id>4</id>
<pd>d</pd>
<id>7</id>
</result>
根据提供的XML文档计算此XPath 2.0表达式(和XQuery)时:
/*/pd[not(. = preceding-sibling::pd)]
/(.|following-sibling::id[1])
<result>
<pd>a</pd>
<id>1</id>
<pd>a</pd>
<id>2</id>
<pd>b</pd>
<id>8</id>
<pd>c</pd>
<id>9</id>
<pd>c</pd>
<id>4</id>
<pd>d</pd>
<id>7</id>
</result>
A.
1.
A.
2.
B
8.
C
9
C
4.
D
7.
生成所需的正确结果:
a
1.
B
8.
C
9
D
7.