Orbeon: как отображать динамические выпадающие значения из ресурса файловой системы
Я новичок в Orbeon и пытаюсь реализовать динамический раскрывающийся список, где значения заполняются из XML-поиска в файловой системе.
Итак, вот требование: первый выпадающий список (Animal) будет иметь 2 значения: Cat и Dog. В зависимости от выбора, второй выпадающий список (Породы) будет отображать список пород.
2 xml файла, содержащие породы, зарегистрированы как ресурсы и выглядят так:
CAT: \ forms \ quote \ lookup \ catbreeds.xml
<?xml version="1.0" encoding="UTF-8"?>
<breeds>
<item>
<value>C1</value>
<label>Domestic Long Hair</label>
</item>
<item>
<value>C2</value>
<label>Domestic Medium Hair</label>
</item>
<item>
<value>C3</value>
<label>Domestic Short Hair</label>
</item>
<item>
<value>C4</value>
<label>Mixed Breed</label>
</item>
<item>
<value>C5</value>
<label>Tabby</label>
</item>
<item>
<value>C6</value>
<label>Abyssinian</label>
</item>
<item>
<value>C7</value>
<label>American Bobtail</label>
</item>
</breeds>
СОБАКА: \ формы \ цитата \lookup\dogbreeds.xml
<?xml version="1.0" encoding="UTF-8"?>
<breeds>
<item>
<value>D1</value>
<label>Cavapoo</label>
</item>
<item>
<value>D2</value>
<label>Cockapoo</label>
</item>
<item>
<value>D3</value>
<label>Crossbreed</label>
</item>
<item>
<value>D4</value>
<label>Goldendoodle</label>
</item>
<item>
<value>D5</value>
<label>Labradoodle</label>
</item>
<item>
<value>D6</value>
<label>Maltipoo</label>
</item>
<item>
<value>D7</value>
<label>Mi Ki</label>
</item>
</breeds>
Form.xml выглядит так:
Модель:
<xf:instance id="fr-form-instance" xxf:exclude-result-prefixes="#all">
<form>
<section-1>
<animal/>
<breed/>
</section-1>
</form>
</xf:instance>
<xf:instance id="pets"
xmlns="">
<root>
<item name="Cat" value="cat"/>
<item name="Dog" value="dog"/>
</root>
</xf:instance>
Тело:
<xh:body>
<fr:view>
<fr:body
xmlns:oxf="http://www.orbeon.com/oxf/processors"
xmlns:p="http://www.orbeon.com/oxf/pipeline"
xmlns:xbl="http://www.w3.org/ns/xbl">
<fr:section id="section-1-control" class="no-header-section" bind="section-1-bind">
<fr:grid>
<xh:tr>
<xh:td>
<fr:dropdown-select1 id="animal-control" ref="animal" bind="breed-bind">
<xf:label ref="$form-resources/animal/label"/>
<xf:itemset ref="instance('pets')/item">
<xf:label ref="@name"/>
<xf:value ref="@value"/>
</xf:itemset>
</fr:dropdown-select1>
</xh:td>
</xh:tr>
<xh:tr>
<xh:td>
<fr:dropdown-select1 id="breed-control" bind="breed-bind">
<xf:label ref="$form-resources/breed/label"/>
<xf:itemset
ref="doc('oxf:/forms/quote/lookup/catbreeds.xml')/breeds/item">
<xf:label ref="label"/>
<xf:value ref="value"/>
</xf:itemset>
</fr:dropdown-select1>
</xh:td>
</xh:tr>
</fr:grid>
</fr:section>
</fr:body>
</fr:view>
</xh:body>
Теперь проблема заключается в атрибуте ref в ref = "doc ('oxf: / forms / quote / lookup /catbreeds.xml') / breeds / item">. Я могу загрузить отдельные списки (в этом случае загружаются породы кошек), но я не могу найти способ сделать его условным.
Я обнаружил, что не могу использовать XPath для ref (как это: oxf: / forms / quote / lookup / {animal} breeds.xml), чтобы сделать значение динамическим.
Я много чего пробовал, но ничего не получалось. Это будет очень полезно, если кто-то может дать мне направление. Я на Orbeon 4.8
1 ответ
Поскольку значение ref
XPath, вы можете создать URL, который вы передаете doc()
динамически, делая что-то вроде этого:
doc(concat(
'oxf:/forms/quote/lookup/',
instance('fr-form-instance')/section-1/animal,
'breeds.xml'
))/breeds/item