如何为xml文档联合,交集,设置差异和交叉产品?

时间:2016-07-21 16:01:25

标签: xml

我有三个文件xml:

来自水手的实例S1(S1.xml):

<xml>
     <data>
       <sid>22</sid>
       <sname>Dustin</sname>
       <rating>7</rating>
       <age>45</age>
     </data>
      <data>
       <sid>31</sid>
       <sname>Lubber</sname>
       <rating>8</rating>
       <age>55</age>
     </data>
      <data>
       <sid>58</sid>
       <sname>Rusty</sname>
       <rating>10</rating>
       <age>35</age>
     </data>
</xml>

来自水手的实例S2(S2.xml):

 <xml>
     <data>
       <sid>28</sid>
       <sname>Yuppy</sname>
       <rating>9</rating>
       <age>35</age>
     </data>
      <data>
       <sid>31</sid>
       <sname>Lubber</sname>
       <rating>8</rating>
       <age>55</age>
     </data>
      <data>
       <sid>44</sid>
       <sname>Gruppy</sname>
       <rating>5</rating>
       <age>35</age>
     </data>
     <data>
       <sid>58</sid>
       <sname>Rusty</sname>
       <rating>10</rating>
       <age>35</age>
     </data>
</xml>
来自Reserves(R1.xml)的

实例R1:

 <xml>
     <data>
       <sid>22</sid>
       <bid>101</bid>
       <day>10/10/96</day>
     </data>
     <data>
       <sid>58</sid>
       <bid>103</bid>
       <day>11/12/96</day>
     </data>
</xml>

我试图将运算符代数用于xml文件,例如:union(∪),intersection(∩),set-difference( - )和cross-product(x)

即时尝试搜索S1∪S2,S1∩S2,S1-S2,S1 X R1

例如我试图制作包含S1∪S2的新文件,如:

<xml>
     <data>
       <sid>22</sid>
       <sname>Dustin</sname>
       <rating>7</rating>
       <age>45</age>
     </data>
      <data>
       <sid>31</sid>
       <sname>Lubber</sname>
       <rating>8</rating>
       <age>55</age>
     </data>
      <data>
       <sid>58</sid>
       <sname>Rusty</sname>
       <rating>10</rating>
       <age>35</age>
     </data>
     <data>
       <sid>28</sid>
       <sname>Yuppy</sname>
       <rating>9</rating>
       <age>35</age>
     </data>
     <data>
       <sid>44</sid>
       <sname>Gruppy</sname>
       <rating>5</rating>
       <age>35</age>
     </data>
</xml>
有人可以帮我吗? 我正在尝试使用XSLT ..

感谢..

最好的问候,

里贾尔

2 个答案:

答案 0 :(得分:1)

有一些示例函数可以在W3C函数和运算符规范中执行这些操作(使用XSLT 2.0或XQuery 1.0)

http://www.w3.org/TR/xpath-functions/#union-intersect-except-on-values

例如,设置差异在XQuery中编码为:

declare function eg:value-except (
  $arg1 as xs:anyAtomicType*,
  $arg2 as xs:anyAtomicType*) as xs:anyAtomicType* 
{
  fn:distinct-values($arg1[not(.=$arg2)])
}

答案 1 :(得分:0)

您没有非常清楚地解释您的要求。但是,如果您的要求是找到S1.xml和S2.xml中出现的所有<data>元素,并且匹配的<sid>足以将数据元素视为匹配,并且如果没有在单个文件中重复,然后是XSLT 2.0中最简单的解决方案

<xsl:for-each-group select="doc('S1.xml')//data, doc('S2.xml')//data"
  group-by="sid">
  <xsl:copy-of select=".[count(current-group()) = 2]"/>
</xsl:for-each-group>