2014-11-14 2 views
0

Я пытаюсь подготовить файл XML для синтаксического анализа JSON и его контекст таков, как:XQuery Рекурсивный вызов функции для Inner Tag

<user_manual> 
    <embed-language_part id="SL14686180"> 
    <language_part id="1" role="-" lang="de"> 
     <embed-user_manual_part id="1"> 
     <user_manual_part id="1" role="-" document-type="IU"> 
      <embed-chapter id="1"> 
      <?ecls-start-embedded-resource resource="ecls_bio_becls_a3_a30660983"?> 
      <chapter id="1" role="-" toctitle="yes" footrowtitle="no" type="security"> 
       <embed-title_module id="1"> 
       <title_module id="1" role="-"> 
        <title id="1">Sicherheits- und Warnhinweise</title> 
       </title_module> 
       </embed-title_module> 
       <embed-section id="1"> 
       <section id="1" footrowtitle="no" role="-" toctitle="yes"> 
        <embed-section id="2"> 
        <section id="2"> 
         <embed-title_module id="2"> 
         <title_module id="2" role="-"> 
          <title id="2">Eisschale</title> 
         </title_module> 
         </embed-title_module> 
        </section> 
        </embed-section> 
        <embed-title_module id="3"> 
        <title_module id="31" role="-"> 
         <title id="3">Bevor Sie das Gerat in Betrieb nehmen</title> 
        </title_module> 
        </embed-title_module> 
       </section> 
       </embed-section> 
      </chapter> 
      </embed-chapter> 
     </user_manual_part> 
     </embed-user_manual_part> 
    </language_part> 
    </embed-language_part> 
</user_manual> 

Я написал сценарий XQuery относительно моих ожиданий первого (предположим, что $doc является документом, $matnr является 22333),

declare variable $doc external; 
declare variable $matnr external; 
<dmContainer>{ 
for $language in $doc/user_manual/embed-language_part/language_part 
let $lang_code := data($language/@lang) 
for $embed_chapter in $language/embed-user_manual_part/user_manual_part/embed-chapter 
let $objectid := data($embed_chapter/processing-instruction('ecls-start-embedded-resource'))[1] 
let $fileattr := string($objectid) 
let $filename := translate(substring-after($objectid,'resource='),'&quot;','') 
let $postfix := substring(tokenize($filename,'_')[last()], 2)  

let $name := concat($matnr, '_', $postfix)        
return (element {$lang_code} {  
    attribute title {data($embed_chapter/chapter/embed-title_module/title_module/title)}, 
    attribute language {$lang_code}, 
    attribute name {$name},   
    for $section in $embed_chapter/chapter/embed-section/section 
     return <section title="{data($section/embed-title_module/title_module/title)}"></section> 
}) 
}</dmContainer> 

Это возвращает:

<dmContainer> 
    <de title="Sicherheits- und Warnhinweise" language="de" name="223333_30660983"> 
     <section title="Bevor Sie das Gerat in Betrieb nehmen" /> 
    </de> 
</dmContainer> 

Возврат содержит элемент главы и заголовок его первого раздела для JSON, но я должен добавить его ко всем разделам (разделы, включенные в разделы).

В соответствии с входным XML разделы могут иметь рекурсивные разделы (один или несколько). Вы можете посмотреть пример, глубоко изучив его. Вопрос в том, как я могу добавить эти разделы в свой вывод с правильным рекурсивным способом (я имею в виду не только дочерний уровень, на котором один уровень два ребенка тоже включены), я искал некоторые примеры рекурсивных функций XQuery, но я не мог получить кто угодно.

Ожидаемый результат:

<dmContainer> 
    <de title="Sicherheits- und Warnhinweise" language="de" name="223333_30660983"> 
     <section title="Bevor Sie das Gerat in Betrieb nehmen"> 
     <section title="Eisschale"/> 
     </section> 
    </de> 
</dmContainer> 

Как я могу получить все разделы?

+0

Пожалуйста, посмотрите, как опубликовать [SSCCE] (http://www.sscce.org). Если вы хотите, чтобы другие отвечали на ваш вопрос конкретно на ваш код, убедитесь, что они могут напрямую запускать код, скопировав его: никаких внешних переменных, что такое '$ language'? Некоторый правильный отступ для XML также поможет понять проблему. –

+0

Я написал по вопросу $ doc - это имя документа, а $ matnr - 22333. Остальные производные от $ doc, также выводится язык $. Так в чем проблема ? – Hayra

+0

Кажется, мне не удалось собрать все вместе, вы правы. Я удалил свой downvote, так как код работает после некоторых изменений. Тем не менее я до сих пор не рассматриваю этот вопрос. Почему вы объявляете внешние переменные вместо того, чтобы размещать там контент? Не нужно описывать, что им передать (и это описание не совсем корректно: кажется, что '$ doc' не должен содержать« имя документа », но документ). Это вопрос демонстрации усилий, а также удаление ненужных частей (например, вся конструкция атрибутов языка и имени, что не имеет отношения к вопросу. –

ответ

0

Если вы просто хотите всех разделов в этой главе (в порядке документов), идут с descendant-or-self-step, сокращенно //.

for $section in $embed_chapter/chapter//embed-section/section 
    return <section title="{data($section/embed-title_module/title_module/title)}" 

Если заказ документ не работает для вас (например., Первое название текущего раздела, то все подразделы на текущем уровне, независимо от того, если они на самом деле предшествуют название), вы будете иметь написать собственную функцию, проходящую по дереву: функция, которая получает текущий раздел, возвращает заголовок и рекурсивно вызывает себя для прямых подразделов (если они есть).

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