Может ли XPath объединить два значения набора узлов?(для использования в XForms) - PullRequest
2 голосов
/ 09 июня 2010

Я хочу объединить два значения набора узлов, используя XPath в XForms.

Я знаю, что в XPath есть функция concat (string, string), но как мне объединить два значения набора узлов?

BEGIN EDIT: Iпопробовал функцию concat .. Я попробовал это .. и варианты этого, чтобы заставить это работать, но это не

<xf:value ref="concat(instance('param_choices')/choice/root, .)"/>

КОНЕЦ РЕДАКТИРОВАНИЯ

Ниже приведен упрощенный пример кода, которого я пытаюсь достичь.

Модель XForms:

<xf:instance id="param_choices" xmlns="">
    <choices>
        <root label="Param Choices">/param</root>
        <choice label="Name">/@AAA</choice>
        <choice label="Value">/@BBB</choice>
    </choices>
</xf:instance>

Код пользовательского интерфейса XForms, который у меня сейчас есть:

<xf:select ref="instance('criteria_data')/criteria/criterion" appearance="full">
    <xf:label>Param choices:</xf:label>    
    <br/>
    <xf:itemset nodeset="instance('param_choices')/choice">
        <xf:label ref="@label"></xf:label>
        <xf:value ref="."></xf:value>
    </xf:itemset>
</xf:select>    

(если пользователь выбирает флажок «Имя» ..) вывод XML:

<criterion>/@BBB</criterion>

Однако!Я хочу объединить значение корневого узла с текущим значением выбора узла.

По существу:

<xf:value ref="concat(instance('param_choices')/choice/root, .)"/>

или

<xf:value ref="(instance('definition_choices')/choice/root) + ."/>

для получения следующего XMLвывод:

<criterion>/param/@BBB</criterion>

Есть предложения, как это сделать?(Я довольно новичок в XPath и XForms)

ps то, что я спрашиваю, имеет смысл для меня, когда я его набрал, но если у вас возникли проблемы с выяснением того, что я спрашиваю, просто дайте мне знать

спасибо!

Ответы [ 3 ]

1 голос
/ 10 июня 2010

Проблема в том, что вы используете атрибут ref вместо атрибута value в элементе value .Атрибут ref предназначен для привязки элементов к одному узлу, а атрибут value - для использования значения из разрешенного выражения XPath.

Существует также небольшая ошибка в самом выражении XPath, поэтомуесли вы измените свой элемент value на этот:

<xf:value value="concat(instance('param_choices')/root, .)" />

... вы обнаружите, что он работает правильно.

1 голос
/ 10 июня 2010

Построение динамических выражений XPath еще не поддерживается в XForms. Для Javascript такой функции как eval () не существует.

В качестве очень ограниченного обходного пути вы можете использовать выражение, такое как

/*[name() = substring-after(instance('param_choices')/root,'/')]/@*[name() = substring-after(.,'/@')]

1 голос
/ 09 июня 2010

Оценка выражения XPath не может изменить структуру / содержимое документа XML - она ​​выбирает только (набор) существующих узлов .

Чтобы создать узел, который не существует в документе XML, необходимо использовать другие средства в сочетании с XPath (например, XSLT).

...