2016-05-02 5 views
0

Ниже представлены два файла XML. Я хочу отфильтровать XMLA только тем людям, которые существуют в XMLB, используя поле name.Фильтрация одного XML с использованием узлов из второго XML в XSLT 1.0

Оба XML-документа хранятся в переменных $ XMLA и $ XMLB.

Я создал выход с помощью XQuery 1.0, но я не уверен, как выполнить ту же операцию в XSLT 1.0.

XMLA:

<table> 
<row> 
    <name>NNN</name> 
    <address>1234 NN</address> 
    <phone>23423423</phone> 
</row> 
<row> 
    <name>kkk</name> 
    <address>1234 KK</address> 
    <phone>4343434</phone> 
    </row> 
</table> 

XMLB:

<table> 
<row> 
    <id>1111</id> 
    <batch>1212</batch> 
    <name>NNN</name> 
</row> 
<row> 
    <id>2222</id> 
    <batch>2121</batch> 
    <name>kkk</name> 
</row> 
</table> 

XQuery:

for $y in fn:doc('XMLA.xml')/table/row 
for $x in fn:doc('XMLB.xml')/table/row 
for $a in $x/name 
where $y/name = $a 
order by $y/name 
return $y 

Поэтому я ищу в XSLT, потому что синтаксический на большой файл XML крайне медленно с XQuery. Я не уверен, что это из-за того, что мой XQuery построен неправильно, но я хочу дать XSLT попробовать и сравнить эффективность.

ответ

1

Похоже, ваш XQuery подход выделяет совершенно новый документ B для каждого <row> в документе А.

Использовать переменные для хранения документов один раз.

xquery version "1.0"; 

(: your call to fn:doc('XMLA.xml') here :) 
let $A := <table> 
<row> 
    <name>NNN</name> 
</row> 
<row> 
    <name>kkk</name> 
</row> 
<row> 
    <name>xxx</name> 
</row> 
</table> 

(: your call to fn:doc('XMLB.xml') here :) 
let $B := <table> 
<row> 
    <name>nnnn</name> 
</row> 
<row> 
    <name>kkk</name> 
</row> 
<row> 
    <name>xxx</name> 
</row> 
</table> 

let $nameA := $A/row/name 
let $nameB := $B/row/name 

for $name in $nameA 
where $name = $nameB 
order by $name 
return $name 

возвращает

<name>kkk</name> 
<name>xxx</name> 

для меня. Проверьте, улучшена ли производительность.

+0

Это работает отлично. Это значительно сократило время разбора с 30 секунд (от моего метода) до ~ 1 сек (используя то, что вы предложили). Большое спасибо! – Cris3k

+0

У XSLT есть средство, которое может помочь сократить время обработки очень больших входов (xsl: key), но я бы сказал, что использую то, что у вас здесь, 1 секунда не кажется необоснованным. – Tomalak