0

XML:

   <h>
    <rl>
      <c/>
      <c/>
      <c/>
      <c/>
      <c/>
      <c/>
      <c/>
      <c/>
    </rl>
    <rl>
      <c/>
      <c/>
      <c/>
      <c>.01</c>
      <c/>
      <c/>
      <c/>
      <c/>
    </rl>
    <rl>
      <c/>
      <c/>
      <c/>
      <c/>
      <c/>
      <c/>
      <c/>
      <c/>
    </rl>
    <rl>
      <c/>
      <c/>
      <c/>
      <c/>
      <c>.01</c>
      <c>.01</c>
      <c>.01</c>
      <c>.01</c>
    </rl>
</h>

我面临的问题是:

我需要从具有特殊条件<c>的每个<rl>元素的第 4 个元素中选择一个值:假设这rl[3]/c[4]是我当前的节点。我需要找到最后一个父母的非零值的兄弟姐妹c[4]并检查它的值(在这种情况下它将rl[2]/c[4]是 0.01)。

任何想法表示赞赏。

/EDIT 也许我不够清楚:我永远不知道我在哪个rl元素中有这个非零值,所以公式必须足够巧妙才能找到它。在这种情况下,非零值在第二个rl元素内,但它可能在第一个或第三个,如果我要匹配第 4 个、第 5 个等rl元素,它需要rl在每一步从非空元素中找到一个值。

4

3 回答 3

0

如果您当前的节点是rl[3]/c[4]并且您想要<c>.01</c>使用 XPATH rl[3]/c[4]/parent::rl/preceding-sibling::rl[1]/c[4]

于 2013-05-28T09:59:17.283 回答
0

对于您的示例 xml,密钥基础解决方案将在 r1 中为 c“药水添加密钥:

<xsl:key name="kCpos" match="rl/c" use="count(preceding-sibling::c)+1"/>

比您可以轻松地在某个药水(例如 4)和条件(有文字)处选择所有 c:

<xsl:value-of select="key('kCpos', 4)[text()]"/>

要获得rl这种情况:

<xsl:value-of select="key('kCpos', 4)[text()]/.." />

4可以通过类似的东西复发count(preceding-sibling::c)+1

于 2013-05-28T10:05:36.010 回答
-1

好的,我花了一些时间来解决这个问题,但这里是:

<xsl:template match="c">
<xsl:variable name="prev-non-zero-value">
<xsl:value-of select="../preceding-sibling::rl[child::c[position()='4']!=''][position()='1']/c[position()='4']"/>
</xsl:variable>
</xsl:template>

解释一下:我正在匹配c元素并创建prev-non-zero-value具有值的变量:
1. ../preceding-sibling::rl- 选择c前同级的父级:(rl
2. [child::c[position()='4']- 仅匹配具有与 '' 不同的值的rl第 4 个子元素的元素 3.选择第一个匹配列表中的元素(作为前面的元素“向上”) 4. - 选择给定元素的第4 个子元素 5. 利润c
[position()='1']rl
/c[position()='4']crl

这真的很复杂,所以如果您有任何其他想法如何解决这个问题,我真的很愿意接受任何建议;)

于 2013-05-29T06:26:46.067 回答