在XPath中比较同一节点属性值与子元素值的技术咨询
解决Grid节点下属性与子元素值比较的XPath需求
没问题,我来帮你搞定这个XPath的需求~先把你的XML示例清晰列出来,方便咱们对照分析:
<Grid> <GridRow ItemValue="10" ItemType="A"> <YS_P_Name>L2</YS_P_Name> <YS_P_BK>10</YS_P_BK> </GridRow> <GridRow ItemValue="10" ItemType="A"> <YS_P_Name>L3</YS_P_Name> <YS_P_BK>20</YS_P_BK> </GridRow> <GridRow ItemValue="30" ItemType="B"> <YS_P_Name>L1</YS_P_Name> <YS_P_BK>40</YS_P_BK> </GridRow> </Grid>
你需要的是筛选出Grid下所有满足自身属性值与子元素值比较条件的GridRow节点,下面分常见的比较场景给出对应的XPath表达式:
1. 属性值等于子元素文本值
如果要找ItemValue属性值和子元素YS_P_BK的文本值相等的GridRow,表达式如下:
/Grid/GridRow[@ItemValue = YS_P_BK/text()]
解释:
/Grid/GridRow:定位到根节点Grid下的所有GridRow子节点;[@ItemValue = YS_P_BK/text()]:过滤条件,比较当前GridRow节点的ItemValue属性值,和它的子元素YS_P_BK的文本内容是否相等。
在你的示例中,第一个GridRow会被选中(两者都是10)。
2. 属性值大于/小于子元素文本值
如果需要比较大小,直接替换运算符即可:
- 找
ItemValue小于YS_P_BK值的节点:
注意:在XML相关的工具(比如XSLT)中,/Grid/GridRow[@ItemValue < YS_P_BK/text()]<需要转义为<,所以表达式要写成:/Grid/GridRow[@ItemValue < YS_P_BK/text()] - 找
ItemValue大于YS_P_BK值的节点:/Grid/GridRow[@ItemValue > YS_P_BK/text()]
在你的示例中,第二、第三个GridRow会被选中(10<20,30<40)。
3. 处理子元素的空白字符
如果YS_P_BK的文本可能包含多余的空白(比如换行、空格),可以用normalize-space()消除影响,比如:
/Grid/GridRow[@ItemValue = normalize-space(YS_P_BK/text())]
这个函数会去除文本首尾的空白,并把中间的连续空白替换成单个空格,避免空白导致的比较错误。
内容的提问来源于stack exchange,提问作者Shadmehr
相关产品推荐
相关产品推荐

