Я пытаюсь подготовить файл 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='),'"','')
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>
Как я могу получить все разделы?
Пожалуйста, посмотрите, как опубликовать [SSCCE] (http://www.sscce.org). Если вы хотите, чтобы другие отвечали на ваш вопрос конкретно на ваш код, убедитесь, что они могут напрямую запускать код, скопировав его: никаких внешних переменных, что такое '$ language'? Некоторый правильный отступ для XML также поможет понять проблему. –
Я написал по вопросу $ doc - это имя документа, а $ matnr - 22333. Остальные производные от $ doc, также выводится язык $. Так в чем проблема ? – Hayra
Кажется, мне не удалось собрать все вместе, вы правы. Я удалил свой downvote, так как код работает после некоторых изменений. Тем не менее я до сих пор не рассматриваю этот вопрос. Почему вы объявляете внешние переменные вместо того, чтобы размещать там контент? Не нужно описывать, что им передать (и это описание не совсем корректно: кажется, что '$ doc' не должен содержать« имя документа », но документ). Это вопрос демонстрации усилий, а также удаление ненужных частей (например, вся конструкция атрибутов языка и имени, что не имеет отношения к вопросу. –