【问题标题】:xpath 1.0 distinct itemsxpath 1.0 不同的项目
【发布时间】:2016-04-14 20:04:49
【问题描述】:

使用 xpath 1.0

我有以下 xpath

/root/Locale/Client[@id=1234]/Category/Category/Category

它是一个大型 xml 文档。

每个类别如下所示:

<Category 
    id="7211" 
    parentID="5103" 
    level="4" 
    creatorID="1" 
    sortOrder="2" 
    createDate="2014-09-12T09:19:17" 
    updateDate="2016-03-30T13:42:01" 
    nodeName="All" 
    urlName="all" 
    path="-1,1719,3292,5103,7211" 
    isDoc="" 
    nodeType="1071" 
    creatorName="Suhel Ahmed" 
    writerName="Suhel Ahmed" 
    writerID="1" 
    template="0" 
    nodeTypeAlias="Category">

基本上我需要在第 3 级类别中选择不同类别,其中不同性基于 nodeName。

我知道在 xpath 2.0 中我们有不同的值,但在 xpath 1 中没有。有没有办法可以用 xpath 1.0 做到这一点

【问题讨论】:

  • 3rd level 你的意思是 *where 属性 level 等于 3?
  • 你到底想返回什么,是不同的nodeName 属性列表还是列表Category 元素?如果是后者,那么当有多个Category元素具有相同的nodeName属性值时应该返回什么?
  • 实际上上面的 xpath 达到了正确的级别,但该深度的实际属性级别是 6。我们可以使用后代和 {@level=6]
  • 我想返回一组具有不同 nodeName 的类别节点
  • 我猜可能会返回第一个唯一类别

标签: xml xpath


【解决方案1】:

其实这个问题我还不清楚。因此,首先,我假设您要过滤 @level=6,如您的评论中所述。

现在,假设要检查重复的所有Category 元素共享同一个父元素,您可以使用preceding-sibling 如下所示返回不同的Category 元素。如果源 XML 中有重复的 nodeName 属性,则只会返回具有该 nodeName 值的第一个 Category 元素:

//Category[@level='6' and not(@nodeName = preceding-sibling::Category[@level='6']/@nodeName)]

否则,如果Category 元素可能不共享同一个父元素,请尝试使用preceding 轴替换preceding-sibling

//Category[@level='6' and not(@nodeName = preceding::Category[@level='6']/@nodeName)]

【讨论】:

  • 太棒了,您的第二个假设是正确的。类别节点不会共享同一个父节点。现在就试试看。
  • 仍然有点偏离应该有一个“和”但现在可以工作 //Category[@level='5' 而不是(@nodeName = previous::Category[@level='5 ']/@nodeName)]
  • 当然是关了!感谢您的更正。不过,如果我有示例 XML 来测试 XPath,则可以避免这种情况:(
  • 非常感谢 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-12-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多