Как сделать правильный синтаксис для XQuery Looping - PullRequest
1 голос
/ 07 октября 2011

Теперь у меня есть дита композит, как:

<root>
 <topic>....</topic>
 <topic>....</topic>
 <topic>....</topic>
 <topic>....</topic>
 <topic>....</topic>
</root>

И мне просто нужно написать xquery, который в основном создаст дамап для каждой темы, поэтому дитамап пересчета должен выглядеть следующим образом:

<map>
 <topicref>....</topicref>
 <topicref>....</topicref>
 <topicref>....</topicref>
 <topicref>....</topicref>
 <topicref>....</topicref>
</map>

Мой текущий Xquery не совсем правильно делает, он может отловить каждую тему, но вместо создания одного ditamp он создает несколько ditamap, по одному для каждой темы:

 $isFoSaved := for $b in $mapNode/*[local-name() = 'topic']
               let                                     
               $topicWithPI := let $holder:=1
               return (
                      <topicref href="1.xml#Begin" navtitle="Begin" scope="local" type="topic"/>
                ),  

Могут ли эксперты помочь? Спасибо

Ответы [ 2 ]

1 голос
/ 11 октября 2011

Если вы хотите сохранить иерархию вложенных тем, это немного сложнее. Я думаю, что для этого лучше всего использовать рекурсивную функцию:

declare function local:topicref($topics)
{
  for $b in $topics
  return 
    <topicref href="1.xml#Begin" 
              avtitle="Begin"
              scope="local" 
              type="topic">{
      local:topicref($b/*[local-name() = 'topic'])
    }</topicref>

};

<map>{
 let $mapNode := 
   <root>
     <topic><topic>....</topic></topic>
     <topic>....</topic>
     <topic>....</topic>
     <topic>....</topic>
     <topic>....</topic>
    </root>
 return 
   local:topicref(
     $mapNode/*[local-name() = 'topic']
   )
}</map>

Результат:

<?xml version="1.0" encoding="UTF-8"?>
<map>
  <topicref href="1.xml#Begin" avtitle="Begin" scope="local" type="topic">
    <topicref href="1.xml#Begin" avtitle="Begin" scope="local" type="topic"/>   
  </topicref>
  <topicref href="1.xml#Begin" avtitle="Begin" scope="local" type="topic"/>
  <topicref href="1.xml#Begin" avtitle="Begin" scope="local" type="topic"/>
  <topicref href="1.xml#Begin" avtitle="Begin" scope="local" type="topic"/>
  <topicref href="1.xml#Begin" avtitle="Begin" scope="local" type="topic"/>
</map>
1 голос
/ 07 октября 2011

Я вижу только то, что вы встраиваете несколько выражений flwor.

Всякий раз, когда вы используете $x := let $y ... или $x := for $y ..., вы начинаете новое выражение flwor, которое должно быть закрыто предложением return.Следовательно, ваш отсканированный код недействителен / неполон: у вас есть два открытых выражения flwor, но только одно предложение return.

Если вы попытаетесь сохранить его на ровном месте, это будет намного проще.

Например:

<map>{
 let $mapNode := 
   <root>
     <topic>....</topic>
     <topic>....</topic>
     <topic>....</topic>
     <topic>....</topic>
     <topic>....</topic>
    </root>
  for $b in $mapNode/*[local-name() = 'topic']
  return 
    <topicref href="1.xml#Begin" 
              avtitle="Begin"
              scope="local" 
              type="topic"/>
}</map>

этот запрос работает на try.zorba-xquery.com , но я не уверен, что это то, что вы ищете?

...