XSLT查找具有非零值的最后父节点的前一个兄弟节点

时间:2013-05-28 09:27:44

标签: xslt siblings

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>元素的第4个<rl>元素中选择一个值: 比方说,rl[3]/c[4]是我当前的节点。我需要找到c[4]中非零值的最后一位父母的兄弟姐妹,并检查它的值(在这种情况下,它将是rl[2]/c[4],即0.01)。

任何想法都表示赞赏。

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

3 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

对于您的示例x​​ml,密钥库解决方案将执行此操作 在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

等重播

答案 2 :(得分:-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个子c元素的值与''不同 3. [position()='1']从列表中选择第一个匹配的rl元素(如前面的计数元素“up”)
4. /c[position()='4'] - 选择给定c元素的第4个子rl元素 5.利润

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