XSLT 1.0: объединение атрибутов от дочерних узлов - PullRequest
1 голос
/ 31 мая 2011

У меня возникли некоторые проблемы с xslt, и я надеялся, что, возможно, кто-то здесь сможет мне помочь:

Мой xml-файл, который выглядит следующим образом:

<garden>
  <appletree>
    <fruit name="a" />
    <fruit name="b"/>
    <fruit name="c"/>
    <fruit name="d"/>
  </appletree>

  <appletree>
    <fruit name="e" />
    <fruit name="f"/>
    <fruit name="p"/>
    <fruit name="h"/>
  </appletree>

 <appletree>
    <fruit name="e" />
    <fruit name="f"/>
    <fruit name="q"/>
    <fruit name="r"/>
  </appletree>
</garden>

Теперь я бынравится назначать ключи для appletree-узлов, состоящих из объединенных атрибутов имени их дочерних элементов.Таким образом, ключ для первого дерева будет 'abcd', для второго дерева 'efph' и для третьего дерева 'efqr'.

Я попробовал следующее:

<xsl:key name="key" match="appletree" use="fruit/@name" />

'fruit / @ name 'возвращает набор всех атрибутов имени, но в качестве ключа используется только первое.Другие игнорируются.Поэтому в основном мне нужна функция, которая делает что-то вроде этого: concat (fruit [1] / @ name, ..., fruit [n] / @ name).

Есть ли такая функция в XSLT 1.0?(Я не могу использовать XSLT 2.0, который, я думаю, сделает это намного проще.)

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

1 Ответ

2 голосов
/ 31 мая 2011

Это что-то вроде хака, но нет никаких причин, по которым вы не можете просто использовать concat, а 'n' - это максимум, что вы когда-либо найдете.

concat(fruit/@name,fruit[2]/@name,fruit[3]/@name,fruit[4]/@name,fruit[5]/@name)

Если есть только 4, последний будет просто проигнорирован, и он будет использовать значение длины 4.NB: Вам не нужно [1] для первого, оно все равно даст это по умолчанию.

Любое другое решение, вероятно, будет значительно сложнее.Я могу придумать один способ с использованием двухпроходного подхода, но это сделает код гораздо менее читабельным и обслуживаемым.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...