Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xml xquery---使用与当前节点不同的值访问下一个节点_Xml_Xpath_Xquery - Fatal编程技术网

Xml xquery---使用与当前节点不同的值访问下一个节点

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

这是我正在使用的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>
  <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.