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
元素开始。
答案 0 :(得分:0)
如果您当前的节点为rl[3]/c[4]
,并且您希望<c>.01</c>
使用XPATH rl[3]/c[4]/parent::rl/preceding-sibling::rl[1]/c[4]
。
答案 1 :(得分: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
答案 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.利润
这真的很复杂,所以如果你有任何其他想法如何解决这个问题,我真的愿意接受任何建议;)