2016-07-21 1 views
0

У меня есть три файла 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> 

экземпляр R1 из резервов (R1.xml):

<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> 

im пытается использовать операторную алгебру для xml fil e: объединение (∪), пересечение (∩), set-difference (-) и кросс-произведение (×)

im try search 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 ..

спасибо ..

наилучших пожеланий,

риджало

+1

Какой язык вы используете? Кроме того, что R1 - есть S2 два раза? – choroba

+0

@choroba im triying using xslt, могу я это сделать? Извините, приятель, я ошибочно написал .. :) У меня есть правильный вопрос. – Rijal

ответ

1

Есть примеры функций, которые выполняют эти операции (с помощью XSLT 2.0 или XQuery 1.0) в W3C функции и операторы спецификация на

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)]) 
} 
+0

Можете ли вы научить меня, как решить мою проблему, используя реализацию XSLT ..? На самом деле, я новичок и только что узнал XSLT .. спасибо раньше .. – Rijal

+1

StackOverflow предназначен для ответа на конкретные технические вопросы, а не для обучения. Если вы хотите преподавать, я написал книгу ... –

+0

как я могу посмотреть вашу книгу? – Rijal

0

Вы не очень четко объяснили свое требование. Но если вам нужно найти все элементы <data>, отображаемые как в S1.xml, так и в S2.xml, и если сопоставления <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>