XSLT - перебрать набор узлов
У меня есть XML как это:
<root>
<row>
<col name="col1"><root><row><col name="COL_NAME_1">col_value_1</col>;</row></root></col>
<col name="col2"><root><row><col name="COL_NAME_2">col_value_2</col>;</row></root></col>
</row></root>
Мне нужно получить экранированную коллекцию из col1 и перебрать ее строки. Я использую функцию exsl:node-set. Вот мой упрощенный xsl:
<xsl:template match="/">
<xsl:variable name="collection" select="exsl:node-set(./root/row/col[@name='col1'])" disable-output-escaping="yes" />
<xsl:for-each select="($collection)/root/row">
<!-- ... -->
</xsl:for-each></xsl:template>
Я могу правильно прочитать значение из переменной $collection, используя функцию xsl:value-of, но я не могу перебрать ее, как если бы не было строк. Есть идеи, что я делаю не так?
2 ответа
Если бы автор этого XML хотел, чтобы вы видели элементы типа root и row внутри элемента col, они бы не избежали угловых скобок. Поскольку они экранированы, здесь нет структуры, только текст. Операция получения структуры из текста называется синтаксическим анализом. XSLT 3.0 имеет функцию parse-xml() для разбора текста и создания древовидной структуры; более ранние версии этого не делают, хотя ваш поставщик может предоставить расширения или вы можете написать свой собственный.
node-set()
функция не разбирает. Ваш $collection
переменная представляет собой набор узлов, состоящий из временного узла документа с одним col
ребенок.
Саксонский имеет функцию расширения под названием parse()
это делает то, что вы хотите, как и некоторые другие процессоры XSLT. Я также видел несколько попыток кодирования этого в чистом XSLT, но не знаю, есть ли хорошая реализация.