2016-09-05 68 views
0

我遇到了使用XQuery返回基于标记的常见元素的问题。我正在尝试写一个返回公共元素的XQ函数。比如我有一个XML为: $ schoolA使用XQuery获取常见元素

<schoolA> 
    <name>ABC</name> 
    <students>1000</students> 
    <classes>25</classes> 
</schoolA> 
<schoolA> 
    <name>DEF</name> 
    <students>1200</students> 
    <classes>20</classes> 
</schoolA> 
<schoolA> 
    <name>GHY</name> 
    <students>900</students> 
    <classes>30</classes> 
</schoolA> 

为另一种: $ schoolB

<schoolB> 
    <name>ABC</name> 
    <students>1000</students> 
    <classes>25</classes> 
</schoolB> 
<schoolB> 
    <name>DEF</name> 
    <students>1200</students> 
    <classes>20</classes> 
</schoolB> 
<schoolB> 
    <name>XYZ</name> 
    <students>1100</students> 
    <classes>30</classes> 
</schoolB> 

函数应该返回: $ commonSchool

<schoolA> 
    <name>ABC</name> 
    <students>1000</students> 
    <classes>25</classes> 
</schoolA> 
<schoolA> 
    <name>DEF</name> 
    <students>1200</students> 
    <classes>20</classes> 
</schoolA> 

匹配因素是名称。我试图编写一个嵌套for循环,但坚持将元素附加到变量。如何做到这一点的任何线索都会很棒!

+1

提问作业帮助的问题必须包括您迄今为止解决问题所做的工作摘要,以及对解决问题的描述。请参阅http://stackoverflow.com/help/on-topic。 – joewiz

+0

XQuery 1.0或3.0/3.1?在3.0/3.1中,您可以使用新的“group by”构造。 –

回答

1

此XQuery函数根据<name>元素的值匹配两个元素序列。为简单起见,假定您已将两组School元素封装在名为<schools>的封装中。

这适用于XQuery 1.0。

declare namespace _="http://local/funcs"; 

declare function _:munge($schoolA as element()*, $schoolB as element()*) { 
    $schoolA[name=$schoolB/name] 
}; 

_:munge(schools/schoolA, schools/schoolB) 
+0

或者更简单地说,函数的主体可以是'$ schoolA [name = $ schoolB/name]' –

+0

不幸的是,该应用程序使用v1.0。我会试一试!谢谢! –

+0

将其转化为一个独立的示例,并入Michael的改进,并验证了XQuery 1.0的兼容性 – Chondrops