【问题标题】:XML Comparing and sorting queryXML比较和排序查询
【发布时间】:2010-07-20 10:34:10
【问题描述】:

我有以下 xml,我需要在其中执行以下操作:

如果 title 和 text 元素的值相同,则根据 score 属性对列表元素进行排序

例如: 这里第 1 个和第 3 个列表元素的 title 和 text 的值是相同的,所以这两个应该根据 score 排序并显示得分最高的列表并丢弃其他列表。

我怎样才能做到这一点?

期望的输出:

<list>
    <title>abcd</title>
    <text>abcd</text>
    <score>2</score>
</list>

-----XML-----

<result>
<list>
    <title>abcd</title>
    <text>abcd</text>
    <score>1</score>
</list>
<list>
    <title>efgh</title>
    <text>efgh</text>
    <score>3</score>
</list>
<list>
    <title>abcd</title>
    <text>abcd</text>
    <score>2</score>
</list>
<result>

【问题讨论】:

    标签: xquery


    【解决方案1】:

    假设我对您的理解正确,您只想返回标题和文本相同的列表节点以及得分最高的每个值的节点。并且由于您将问题标记为“xquery”,因此我假设您想在 xquery 中执行此操作。

    declare function local:getHighScores($result as node()) as node()* {
    
      let $same := 
        for $i in $result/list 
        where ($i/title/text() = $i/text/text())
        return $i
    
      let $unique_titles := fn:distinct-values($same/title/text())
    
      return 
        for $title in $unique_titles
        return
          (
          for $j in $result/list
          where $j/title = $title
          order by $j/score descending
          return $j
          )[1]
    
    };
    
    let $xml := <result>
    <list>
        <title>abcd</title>
        <text>abcd</text>
        <score>1</score>
    </list>
    <list>
        <title>efgh</title>
        <text>efgh</text>
        <score>3</score>
    </list>
    <list>
        <title>abcd</title>
        <text>abcd</text>
        <score>2</score>
    </list>
    <list>
        <title>abcdg</title>
        <text>abcde</text>
        <score>2</score>
    </list>
    </result>
    
    
    return local:getHighScores($xml)
    

    【讨论】:

      【解决方案2】:

      如果您想按分数订购list,而不仅仅是返回高分(如 mbrevoort 的回答),您可以执行以下操作:

      注意:我在 XML 中添加了一个额外的 list 以显示一个列表,其中 titletext 不匹配。

      输入 XML(xquery 中的 input.xml):

      <?xml version="1.0" encoding="UTF-8"?>
      <result>
          <list>
              <title>abcd</title>
              <text>abcd</text>
              <score>1</score>
          </list>
          <list>
              <title>abcd</title>
              <text>efgh</text>
              <score>6</score>
          </list>
          <list>
              <title>efgh</title>
              <text>efgh</text>
              <score>3</score>
          </list>
          <list>
              <title>abcd</title>
              <text>abcd</text>
              <score>2</score>
          </list>
      </result>
      

      XQuery:

      <result>
      {
      for $list in doc("file:///C:/xquery_test/input.xml")/result/list[title = text]
      order by $list/title, $list/score
      return
          $list
      }    
      </result>
      

      生成的 XML:

      <?xml version="1.0" encoding="UTF-8"?>
      <result>
          <list>
              <title>abcd</title>
              <text>abcd</text>
              <score>1</score>
          </list>
          <list>
              <title>abcd</title>
              <text>abcd</text>
              <score>2</score>
          </list>
          <list>
              <title>efgh</title>
              <text>efgh</text>
              <score>3</score>
          </list>
      </result>
      

      (这是使用 Saxon-HE XQuery 9 运行的。)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-11-17
        • 1970-01-01
        • 1970-01-01
        • 2023-03-20
        • 1970-01-01
        • 1970-01-01
        • 2015-05-21
        • 1970-01-01
        相关资源
        最近更新 更多