2015-03-06 3 views
1

Я пытаюсь написать запрос XPath, чтобы найти места авторов статей, опубликованных в 2008 году. У меня есть два файла: authors.xml и papers.xml. Я добавил фрагмент каждого файла ниже, чтобы проиллюстрировать структуры каждого из них.Использование XPath с более чем одним файлом XML

Как написать запрос XPath, который получает информацию из обоих файлов? Я написал запрос, чтобы получить расположение каждого автора, но я не знаю, как расширить это, чтобы ограничить результаты авторов, опубликованных в 2008 году

Мой текущий запрос XPath:

doc("authors.xml")//author/location 

Текущий вывода (расположение всех авторов):

<location>Berkeley</location> 
<location>Stanford</location> 

Желаемая выход (расположение только авторов, опубликованных в 2008 году):

<location>Berkeley</location> 

authors.xml:

<authorRoot> 
    <author> 
     <first>John</first> 
     <last>Doe</last> 
     <location>Berkeley</location> 
    </author> 
    <author> 
     <first>Don</first> 
     <last>Knuth</last> 
     <location>Stanford</location> 
    </author> 
</authorRoot> 

papers.xml:

<paperRoot> 
    <paper> 
     <journal> 
      <author>Don Knuth</author> 
      <title>TeX for fun</title> 
      <year>1995</year> 
     </journal> 
    </paper> 
    <paper> 
     <book> 
      <author>Jack Daniels</author> 
      <title>The Ballmer Peak</title> 
      <year>2004</year> 
     </book> 
    </paper> 
    <paper> 
     <journal> 
      <author>John Doe</author> 
      <title>P equals NP</title> 
      <year>2008</year> 
     </journal> 
    </paper> 
</paperRoot> 
+0

В какой среде/платформе вы пытаетесь это сделать? XSLT, возможно? – bjimba

+0

Функция 'document' доступна только в XSLT, а не в чистом XPath. XPath 2.0 имеет очень похожую функцию 'doc', но в чистом XPath 1.0 нет эквивалента. –

+0

Я пересмотрел функцию 'document' /' doc'. Я не знал, что существует различие, так как в моем запросе работали обе формы. Я использую Galax для запуска моих запросов XPath. – user41419

ответ

1

Ну, теперь, когда мы установили XPath 2.0, мы можем использовать для утверждения.

for $a in doc('authors.xml')/*/author 
    return 
    if (doc('papers.xml') 
    /*/paper/*[author = concat($a/first, ' ', $a/last)] 
    /year[. = '2008']) 
    then $a/location else() 

Это все может быть на одной линии, но, пожалуйста, не делайте этого. Если пробел разрешен, используйте его для удобочитаемости.

Смежные вопросы