2015-07-08 2 views
0

Я новичок в XQuery.XQUERY: Как искать тег XML с несколькими значениями имени

У меня есть два Files- Input.xml и config.xml, я хочу, чтобы иметь возможность найти файл Input.xml и проверьте ВСЕ config.xml SOFFS находятся в Input.xml

Используя пример ниже, я хочу проверить, есть ли soff = ABC и soff = DEF и soff = GHI существуют в input.xml, и если все три найдены в input.xml, я хочу вернуть значение группы в файле config.xml БЕЗ ХАРДОДИРОВАНИЯ

Вот мой Input.xml ...

<SOFF SOFNO="3732" NAME="ABC" ACTION="X"> 
     <OPNOKEY> 
     <OPNO>00042</OPNO> 
     <OPNO>00045</OPNO> 
     <OPNO>00069</OPNO> 
     <OPNO>00103</OPNO> 
    </OPNOKEY> 
     <PARMS QTY="3"> 
     <PARM NAME="#NEW" VALUE="3" ACTION="A"/> 
     <PARM NAME="#NEW" VALUE="0" ACTION="R"/> 
     <PARM NAME="#OLD" VALUE="3" ACTION="X"/> 
     </PARMS> 
     <ATTRS QTY="0"/> 
    </SOFF> 
    <SOFF SOFNO="3735" NAME="DEF" ACTION="R"> 
     <OPNOKEY> 
     <OPNO>00042</OPNO> 
     <OPNO>00045</OPNO> 
     <OPNO>00069</OPNO> 
     <OPNO>00103</OPNO> 
     <OPNO>00104</OPNO> 
    </OPNOKEY> 
     <PARMS QTY="1"> 
     <PARM NAME="INSTL" VALUE="GHI" ACTION="R"/> 
     </PARMS> 
     <ATTRS QTY="0"/> 
    </SOFF> 
    <SOFF SOFNO="2959" NAME="STB3" ACTION="R"> 
     <OPNOKEY> 
     <OPNO>00042</OPNO> 
     <OPNO>00045</OPNO> 
     <OPNO>00069</OPNO> 
     <OPNO>00103</OPNO> 
     <OPNO>00104</OPNO> 
     <OPNO>00105</OPNO> 
     </OPNOKEY> 
     <PARMS QTY="0"/> 
     <ATTRS QTY="0"/> 
    </SOFF> 
    <SOFF SOFNO="2958" NAME="JKL" ACTION="R"> 
     <OPNOKEY> 
     <OPNO>00042</OPNO> 
     <OPNO>00045</OPNO> 
     <OPNO>00069</OPNO> 
     <OPNO>00103</OPNO> 
     <OPNO>00104</OPNO> 
     <OPNO>00106</OPNO> 
     </OPNOKEY> 
     <PARMS QTY="0"/> 
     <ATTRS QTY="0"/> 
    </SOFF> 
    <SOFF SOFNO="2957" NAME="MNO" ACTION="R"> 
     <OPNOKEY> 
     <OPNO>00042</OPNO> 
     <OPNO>00045</OPNO> 
     <OPNO>00069</OPNO> 
     <OPNO>00103</OPNO> 
     <OPNO>00104</OPNO> 
     <OPNO>00107</OPNO> 
     </OPNOKEY> 
     <PARMS QTY="0"/> 
     <ATTRS QTY="0"/> 
    </SOFF> 
    <SOFF SOFNO="3349" NAME="PQR" ACTION="A"> 
     <OPNOKEY> 
     <OPNO>00042</OPNO> 
     <OPNO>00045</OPNO> 
     <OPNO>00069</OPNO> 
     <OPNO>00103</OPNO> 
     <OPNO>00110</OPNO> 
    </OPNOKEY> 
     <PARMS QTY="0"/> 
     <ATTRS QTY="0"/> 
    </SOFF> 

Вот мой config.xml ...

<?xml version="1.0" encoding="UTF-8"?> 
<subscriptionmappings> 
<soff name="ABC"> 
<mandatorysoffs> 
    <soff name="DEF"/> 
    <soff name="GHI"/> 
</mandatorysoffs> 
<subscribergroup>sVOD-KidsSuite</subscribergroup> 
</soff> 
</subscriptionmappings> 

Вот, насколько я получаю, я не могу показаться, чтобы выяснить, как проверить для нескольких Soff в пределах где п, я полагаю, мне нужно для цикла или что-то подобное ...

For $i in $config/mandatorysoffs/soff 
where ($input/SOFF/@NAME = $config/soff/@name 
     and $input/SOFF/@NAME = $config/mandatorysoffs/soff/@name 
     and $input/SOFF/@NAME = $config/mandatorysoffs/soff/@name) 

     return $config/subscribergroup/text() 
+0

Я совершенно не знал о выражении xquery/quantified. Полезно знать, спасибо за вашу помощь. Была огромная помощь! -Jeremy – jhynes

ответ

1

Вы можете просто проверить для возникновения каждого soff из первого документа во втором документе, а затем убедитесь, что ни один из них не хватает (т.е. false):

xquery version "1.0"; 

let $chk-soffs := doc("config.xml")//soff/string(@name) 
let $soffs := doc("input.xml")//SOFF/string(@name) 
return 

let $results := for $soff in $soffs 
return 
$chk-soffs = $soff 
return 

not($results = false()) 

или если у вас есть доступ к процессору, который поддерживает XQuery 3.0:

xquery version "3.0"; 

let $chk-soffs := doc("config.xml")//soff/string(@name) 
let $soffs := doc("input.xml")//SOFF/string(@name) 
return 

let $results := $soffs ! $chk-soffs = . 
return 

not($results = false()) 
+0

Благодарим за сообщение о решении моей проблемы, его высоко ценим! – jhynes

+0

Скорее всего, ошибка копирования-вставки, я думаю, вы оставили дополнительный 'for' в значении init' $ results' для XQuery 3.0. –

+0

@FlorentGeorges Ах да действительно. Спасибо, я исправил код. – adamretter

1

Похоже, что вы хотите, чтобы вернуть значение <subscribergroup> для каждого <soff> в вашей конфигурации, для которого имя каждого ребенка <mandatorysoffs> существует как SOFF/@NAME на входе. Использование universal quantifier в пункте where:

for $s in $config/soff 
where 
    every $n in $s/mandatorysoffs/soff/@name 
    satisfies ($n = $input/SOFF/@NAME) 
return $s/subscribergroup/string() 

Обратите внимание, что в вашем примере GHI является PARM/@VALUE так, все равно возвращается пустой.

+0

Я не знал о выражении xquery/quantified. Полезно знать, спасибо за вашу помощь. Была огромная помощь! – jhynes

+0

@jhynes Счастливые помочь. Если этот ответ помог вам, пожалуйста, голосуйте и/или принимайте, если вы считаете, что это самый правильный ответ ... http: //stackoverflow.com/tour – wst