Как извлечь названия стран с помощью Xquery?
tempdata.xml
<ArticleSet>
<Article>
<LastName>Chang</LastName>
<ForeName>K W</ForeName>
<Affiliation>Department of Surgery, Army General Hospital, Taiwan, Republic of
China.</Affiliation>
</Article>
<Article>
<LastName>Ferree</LastName>
<ForeName>B A</ForeName>
<Affiliation>Children's Hospital Medical Center, Cincinnati, Ohio.</Affiliation>
</Article>
<Article>
<LastName>Dyck</LastName>
<ForeName>P</ForeName>
<Affiliation>Department of Neurosurgery, University of Southern California, Los Angeles.</Affiliation>
</Article>
<Article>
<LastName>Lonstein</LastName>
<ForeName>J E</ForeName>
<Affiliation>Minnesota Spine Center, Minneapolis 55454-1419.</Affiliation>
</Article>
</ArticleSet>
Countries.xml
<Countries>
<Country>
<id>1</id>
<name>Los Angeles</name>
<code>ad</code>
</Country>
<Country>
<id>2</id>
<name>Republic of China</name>
<code>ae</code>
</Country>
<Country>
<id>3</id>
<name>China</name>
<code>af</code>
</Country>
<Country>
<id>4</id>
<name>Ohio</name>
<code>ag</code>
</Country>
</Countries>
Код XQuery
declare variable $tokens:="";
declare variable $aff:="";
for $article in doc("tempdata.xml")/ArticleSet/Article
let $aff:=data($article/Affiliation)
let $aff:=replace($aff,'[;,.]',',')
for $tokens in tokenize($aff,',')
for $countries in doc("countries.xml")/Countries/Country
return if($countries/name= normalize-space($tokens))
then <Country>{data($countries/name)}</Country>
Этот код XQuery соответствует строке в Affiliation
тег tempdata.xml
со списком стран в Countries.xml
файл и печатает названия стран. Сначала строка присоединения является токенизированной, и каждый токен сопоставляется со списком доступных стран.
Выход
<Country>Republic of China</Country>
<Country>Ohio</Country>
<Country>Los Angeles</Country>
Я хочу напечатать <Country>-</Country>
тег для строк, в которых не найдена страна. Например, в 4-й организации нет страны, поэтому здесь, в такой ситуации, я хочу вставить тег на основе дефиса. Поэтому у меня вопрос, где написать еще одну часть, чтобы я мог получить следующий вывод.
Требуемый выход
<Country>Republic of China</Country>
<Country>Ohio</Country>
<Country>Los Angeles</Country>
<Country>-</Country>
1 ответ
Ваш текущий запрос потенциально возвращает несколько <Country>
элементов на статью, один на соответствующую организацию. Вы полагаетесь не более чем на один существующий матч. Вы можете собрать все совпадения, добавить "-"
в качестве запасного варианта, а затем возьмите первого кандидата из этой последовательности:
for $article in doc("tempdata.xml")/ArticleSet/Article
let $country :=
for $aff in tokenize($article/Affiliation, '[;,\.]')
where doc("countries.xml")/Countries/Country/name = normalize-space($aff)
return normalize-space($aff)
return <Country>{($country, '-')[1]}</Country>