Xquery 3.0按属性值分组

时间:2016-11-04 16:39:42

标签: xml xpath xquery

在我学习Xquery和Xpath的冒险中,我试图将苹果与他们的类别分组。

我在我的文档中使用 XPath 3.0 XML 1.0

我有这个:

<fruits>

    <fruit>
        <name>Apple</name>
        <category>Summer</category>
    </fruit>

    <fruit>
        <name>Mondarine</name>
        <category>Autumm</category>
    </fruit>

    <fruit>

        <name>Kiwi</name>
        <category>Summer</category>
    </fruit>

    <fruit>
        <name>Aguacate</name>
        <category>Winter</category>
    </fruit>

    <fruit>
        <name>Banana</name>
        <category>Winter</category>
    </fruit>

</fruits>

我需要下一个输出:

<summary>
<category = "Summer"/>
<item list-names = "Apple, Kiwi"/>
</summary>

<summary>
<category = "Autumm"/>
<item list-names = "Mondarine"/>
</summary>

<summary>
<category = "Winter"/>
<item list-names = "Aguacate, Banana"/>
</summary>

如何使用XQuery执行此操作?

可能很容易,但我还没有看到它,我正在努力解决这个问题。谢谢你的帮助!

2 个答案:

答案 0 :(得分:1)

您可以在XQuery中通过迭代类别名称的不同值来解决此问题,然后使用XPath查询与该类别匹配的项目的名称:

<category = "Summer"/>

请注意,您的示例输出不是有效的XML:

<summary category="Summer"> ...
<category value="Summer"/> ...

您存储该值的选项位于属性中:

<summary>
  <category>Summer</category>
  <item list-names="Apple, Kiwi"/>
</summary>
<summary>
  <category>Autumm</category>
  <item list-names="Mondarine"/>
</summary>
<summary>
  <category>Winter</category>
  <item list-names="Aguacate, Banana"/>
</summary>

或者在一个元素中,这是我为这个答案选择的:

string responseString = "BaseNo=5&Width=100";
var dict = HttpUtility.ParseQueryString(responseString);
string json = JsonConvert.SerializeObject(dict.Cast<string>().ToDictionary(k => k, v => dict[v]));
StarBuildParams respObj = JsonConvert.DeserializeObject<StarBuildParams>(json);

答案 1 :(得分:1)

正如您的主题提到XQuery 3.0,您也可以使用group by

for $fruit in fruits/fruit
group by $cat := $fruit/category
return <summary>
  <category>{$cat}</category>
  <items list="{string-join($fruit/name, ', ')}"/>
</summary>