Как извлечь названия стран с помощью 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>

Страны.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 и печатает названия стран. Сначала токенизируется строка Affiliation, и каждый токен сопоставляется со списком доступных стран.

Вывод

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

person Yugam Uppal    schedule 21.01.2019    source источник
comment
Выражение if XQuery в любом случае имеет ветвь else (w3.org/TR/xquery -31/#id-conditionals с IfExpr ::= "if" "(" Expr ")" "then" ExprSingle "else" ExprSingle), поэтому мне интересно, почему ваша попытка без else вообще работает и почему вы ее не использовали,   -  person Martin Honnen    schedule 21.01.2019
comment
Это похоже на нестандартное синтаксическое расширение BaseX, которое интерпретирует if($A) then $B как if($A) then $B else ().   -  person Leo Wörteler    schedule 21.01.2019


Ответы (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>
person Leo Wörteler    schedule 21.01.2019