<documentRoot>
<!-- Test data -->
<?value="2"?>
<parent name="data" >
<child id="1" name="alpha" >Some Text</child>
<child id="2" name="beta" >
<grandchild id="2.1" name="beta-alpha" ></grandchild>
<grandchild id="2.2" name="beta-beta" ></grandchild>
</child>
<pet name="tigger" type="cat" >
<data>
<birthday month="sept" day="19" ></birthday>
<food name="Acme Cat Food" ></food>
</data>
</pet>
<pet name="Fido" type="dog" >
<description>
Large dog!
</description>
<data>
<birthday month="feb" day="3" ></birthday>
<food name="Acme Dog Food" ></food>
</data>
</pet>
</parent>
</documentRoot>
我想获取文档中所有相同元素的元素中某个单词的索引。在这种情况下,我想为“ Acme Dog Food”获得索引2或为“ Acme Cat Food”获得1。我尝试过:
count(//../food[contains(text(), 'Dog')]/preceding::food)
但是我得到一个索引0。 我在这里尝试过:http://www.whitebeam.org/library/guide/TechNotes/xpathtestbed.rhtm
答案 0 :(得分:0)
代码contains(text(), 'Dog')
会在其中查找包含“ Dog”(即<element>Dog</element>
的元素的元素。相反,您正在寻找包含“ dog”的属性“ name”,因此解决方案是:
count(//../food[contains(@name, 'Dog')]/preceding::food)
请注意,这将获得之前的元素数量,但不会获得正确的索引。 XPath中的索引从1开始,而不是0。要解决此问题,只需添加+1
。
答案 1 :(得分:0)
如果向上走两步,您可以算出前面的兄弟姐妹。
1+count(//food[@name="Acme Dog Food"]/../../preceding-sibling::pet)
表达式的问题在于Dog
是属性值的一部分,而不是text()
节点。
答案 2 :(得分:0)
尝试使用此XPath-1.0表达式
public static Expression<Func<T1, bool>> Compose<T1, T2>(this Expression<Func<T1, T2>> convertExpr, Expression<Func<T2, bool>> predicate)
=> Expression.Lambda<Func<T1, bool>>(predicate.Apply(convertExpr.Body), convertExpr.Parameters.First());
或
count(/documentRoot/parent/pet[data/food/@name = 'Acme Dog Food']/preceding-sibling::pet) + 1