У меня есть решение моего вопроса ниже, но мне нужно, чтобы оно было более общим, поэтому мне нужна помощь.
Вопрос:
У нас есть "template.xml", который состоит из смеси элементов <verbatim>
и элементов <argument id='foo'/>
, каждый из которых может быть вложен или не вложен в элементы <part id='part001'>
. (Поэтому дословные обозначения и аргументы могут быть в корневом элементе или в <part> ... </part>
элементах).
Пример "template.xml":
<template_root>
<verbatim>Title</verbatim>
<part id='part001'>
<verbatim>Nested in part 1.</verbatim>
<argument id='keywords'>ARGKEY1, ARGKEY2, ARGKEY3</argument>
<verbatim>End of part 1.</verbatim>
</part>
<part id='DoNotUse'>
<verbatim>This should not be in the output</verbatim>
</part>
<verbatim>End of article</verbatim>
</template_root>
У нас есть еще один файл, "instance.xml", который состоит из элементов "‹ id='someid' />" (относится к ‹ аргумента /> в template.xml), которые опять же могут быть вложены или не вложены в те же элементы "‹ part id='partid' >", что и выше.
Пример "экземпляр.xml":
<instance_root template='template.xml'>
<part id='part001'>
<argument id="keywords" enabled='true'/>
</part>
</instance_root>
Нам нужен XSLT, который считывает следующую информацию из «instance.xml» и генерирует
- Прочитайте имя файла шаблона (например, "template.xml"), а затем
- For all elements in the "template.xml":
- Copy value of all
<verbatim>
in the<template_root>
of template.xml as is. - Скопируйте значение всех
<argument>
в<template_root>
файла template.xml, только если оно также указано в<instance_root>
файла "instance.xml" с тем же@id
и атрибутом@enabled='true'
. - Сделайте то же самое, что и (21) и (22) выше, для всех дочерних элементов каждого
<part>
, найденного только в «template.xml», и только если<part>
с тем же@id
также находится в «instance.xml», игнорируя все остальные<part>
в « шаблон.xml".
- Copy value of all
Итак, что мы НЕ копируем: 1. Все <argument>
в "template.xml", которым нет соответствующего <argument>
в "instance.xml". 2. Все <part>
в "template.xml", которым нет соответствующего <part>
в "instance.xml".
Пример вывода текста:
Title
Nested in part 1.
ARGKEY1, ARGKEY2, ARGKEY3
End of part 1.
End of article
Я использую xsltproc и хотел бы знать, какой общий способ (или лучший способ, который вы можете придумать) сделать это? И под «общим» я подразумеваю, что я действительно не хочу жестко кодировать сложные XPath или ссылаться на отдельные элементы (используя [1], [2] и т. д.).
verbatim
, но не делайте потомковpart
, которые не соответствуют какому-то условию, ноverbatim
также является потомком части. Если также непонятно, какое значение здесь играет внутренняя иерархияinstance.xml
, если она вообще есть. И почему у вас выводится текст, если вы должны копировать элементы. - person michael.hor257k   schedule 05.10.2016<template_root>
и<instance_root>
просто в<part>
и разрешим вложение<part>
элементов. Это также сработало бы для меня. - person RMZ   schedule 05.10.2016