Как извлечь названия стран с помощью Xquery? - PullRequest
0 голосов
/ 21 января 2019

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 Ответ

0 голосов
/ 21 января 2019

Ваш текущий запрос потенциально возвращает несколько <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>
...