Целевые дочерние элементы XML в шаблоне документа XUL - PullRequest
1 голос
/ 20 сентября 2011

Если у меня есть простой XML-документ

<albums>  
  <album name="Napoleon Bonaparte" artist="male" year="1993" genre="rock">  
            <song title="test" track="1"/>
            <song title="test4" track="2"/>
            <song title="test6" track="3"/>
    </album>
  <album name="Cleopatra" artist="female" year="1993" genre="jazz"> 
            <song title="test1" track="1"/>
            <song title="test2" track="2"/>
            <song title="test3" track="3"/>
    </album> 
</albums>

и шаблон

<box id="albumList" orient="vertical" datasources="list.xml" ref="*" querytype="xml">  
  <template>  
    <query expr="*" />  
    <action>  
        <box uri="?" align="left" class="album"  orient="vertical">  
            <box flex="1">
                <description class="albumName" value="?name"/>  
                <label class="albumArtist" value="?artist"/>
            </box>  
            <listbox class="songlist" align="left" collapsed="true">
                <listitem  uri="?" label="?title"/>
            </listbox>
        </box>
    </action>  
  </template>  
</box>

Как получить элемент <listbox> для правильного отображения заголовка каждогопесня под названием альбома?Название альбома / исполнителя отображается нормально, но я не могу понять, как структурировать XML-запрос, чтобы он был нацелен на song потомков album.

1 Ответ

2 голосов
/ 20 сентября 2011

Это довольно сложный вопрос, спасибо за вопрос. Использование рекурсивных шаблонов Документация содержит некоторые подсказки, но, похоже, упускает важную часть.Вот что в итоге работает:

<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> являются предпочтительными, поскольку они не требуют, чтобы вы указывали ориентацию содержимого отдельно.

...