【问题标题】:How to apply position to nodes after filter过滤后如何将位置应用于节点
【发布时间】:2013-02-06 07:05:29
【问题描述】:
<AppXmlLogWritter>
  <LogData>
    <LogID>235820130202134128634953894887814709273</LogID>
    <LogDateTime>20130102134128</LogDateTime>
    <LogType>Warning</LogType>
    <LogFlag>PACSFlag</LogFlag>
    <LogApplication>PACSLogApplication</LogApplication>
    <LogModule>PACSLogModule</LogModule>
    <LogLocation>PACSLogLocation</LogLocation>
    <LogText>PACSLogText</LogText>
  </LogData>
  <LogData>
    <LogID>2358201302021341286349538948878147093861</LogID>
    <LogDateTime>20130202134128</LogDateTime>
    <LogType>Error</LogType>
    <LogFlag>PACSFlag</LogFlag>
    <LogApplication>PACSLogApplication</LogApplication>
    <LogModule>PACSLogModule</LogModule>
    <LogLocation>PACSLogLocation</LogLocation>
    <LogText>PACSLogText</LogText>
  </LogData>
</AppXmlLogWritter>

XpathQuery

/AppXmlLogWritter/LogData[LogApplication/text()[starts-with(. , 'P')]and position()>='1' and position()<='3']

**Before Filter**
<Node 1> Position 1
<Node 2> Position 2
<Node 3> Position 3
<Node 4> Position 4
<Node 5> Position 5
<Node 6> Position 6   

 **After Filter**
<Node 2> Position 2
<Node 5> Position 5
<Node 6> Position 6

见上面的节点列表过滤之前我有6个节点但是当我过滤时我得到三个节点 所以我为那个 position()>='1' 和 position()

【问题讨论】:

    标签: c# asp.net xml xpath system.xml


    【解决方案1】:

    使用括号:

    (/AppXmlLogWritter/LogData[LogApplication[starts-with(. , 'P')]])[position()<=3]
    

    如果您将位置测试放在LogData 谓词中,则它仅适用于该位置步骤,并将匹配限制为那些LogData 元素,它们是它们各自父级的第一个、第二个或第三个LogData 子元素元素。使用括号,您正在构建一个初始节点集(在所有LogApplication 以 P 开头的 LogData 元素中),然后按文档顺序从该集中选择前三个节点。 p>

    【讨论】:

    • @意味着您需要了解这两种形式,它们的含义不同,您需要为每种情况选择合适的一种。例如,/foo/bar[1] 从每个foo 中选择第一个bar,而(/foo/bar)[1] 只选择一个bar(这将是第一个 foo-that-has-any-bars 的第一个 bar 子级)。两者在不同的情况下都有用。我认为它是“[]/ 绑定更紧密”(就像在数学中乘法比加法绑定更紧密一样)。
    猜你喜欢
    • 2012-10-11
    • 1970-01-01
    • 1970-01-01
    • 2021-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-06
    • 1970-01-01
    相关资源
    最近更新 更多