1

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

所以我期待的结果是:

 <pd>a</pd>
 <id>1</id>

 <pd>b</pd>
 <id>8</id>

 <pd>c</pd>
 <id>9</id>

 <pd>d</pd>
 <id>7</id>

我使用 following-sibling::*[2] 到达下一个 pd 并将其与当前节点进行比较,但它只给了我 b,而不是 c 和 d。你们中的任何人都可以给我一个关于如何遍历整个 xml 以获得所需输出的提示吗?谢谢!!

4

2 回答 2

1

可能有更优雅的解决方案,但我采取的策略是收集 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>
于 2012-11-24T05:53:59.277 回答
1

另一种实现相同目标的方法——对于不是很长的序列来说已经足够好了:

/*/pd[not(. = preceding-sibling::pd)]
               /(.|following-sibling::id[1])

当根据提供的 XML 文档评估此 XPath 2.0 表达式(和 XQuery)时:

<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>

产生了想要的正确结果

<pd>a</pd>
<id>1</id>
<pd>b</pd>
<id>8</id>
<pd>c</pd>
<id>9</id>
<pd>d</pd>
<id>7</id>
于 2012-11-24T18:42:19.497 回答