Это довольно сложный вопрос, спасибо за вопрос. Использование рекурсивных шаблонов Документация содержит некоторые подсказки, но, похоже, упускает важную часть.Вот что в итоге работает:
<vbox id="albumList" datasources="list.xml" ref="*" querytype="xml">
<template>
<query expr="album|song">
<assign var="?type" expr="local-name(.)"/>
</query>
<rule>
<where subject="?type" rel="equals" value="album"/>
<action>
<vbox uri="?" align="left" class="album">
<vbox flex="1">
<description class="albumName" value="?name"/>
<label class="albumArtist" value="?artist"/>
</vbox>
<listbox uri="?" class="songlist" align="left"/>
</vbox>
</action>
</rule>
<rule parent="listbox">
<where subject="?type" rel="equals" value="song"/>
<action>
<listitem uri="?" label="?title"/>
</action>
</rule>
</template>
</vbox>
Как следует из документации, это присваивает имя тега XML переменной ?type
и использует его для генерации различного контента для album
и song
теги (через <rule>
и <where>
).Обратите внимание uri="?"
на тег <listbox>
, он обозначает этот тег как точку, в которую необходимо вставить сгенерированный контент для дочерних тегов.Но механизм шаблонов будет дополнительно вставлять содержимое дочерних тегов непосредственно в содержимое родительского тега - этому препятствует ограничение parent="listbox"
на правило для песен.Я изменил выражение запроса на album|song
, чтобы убедиться, что другие теги немедленно игнорируются, но в этом нет особой необходимости.
Примечание: обычно тег <box>
не используется.Теги <hbox>
и <vbox>
являются предпочтительными, поскольку они не требуют, чтобы вы указывали ориентацию содержимого отдельно.