#xml #xslt #xslt-1.0
#xml #xslt #xslt-1.0
Вопрос:
У меня есть XML-код с длинным списком тегов, и я хочу перечислить каждое значение в их теге и их соответствующее значение атрибута «форма». ВСЕ РАЗЛИЧИЯ
Ответ №1:
Всякий раз, когда вы думаете о «различных значениях» в XSLT 1.0, подумайте о «ключах» и группировке по-мюнхенски.
Пример:
Ввод XML
<messages>
<text>
<corr form="Hello">Helo</corr> I'll see you next <corr form="week">wk</corr>.
</text>
<text>
<corr form="Hello">ello</corr>, are you ready <corr form="for">forr</corr> this <corr form="week">weeeek</corr> end?
</text>
<text>
<corr form="Hello">ello</corr> again!
</text>
</messages>
XSLT 1.0
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:key name="forms" match="corr" use="@form"/>
<xsl:key name="values" match="corr" use="normalize-space(.)"/>
<xsl:template match="/*">
<html>
<table>
<xsl:for-each select="//corr[generate-id(.)=generate-id(key('forms',@form))]">
<tr>
<td>
<xsl:value-of select="@form"/>
</td>
<td>
<xsl:apply-templates select="key('forms',@form)[generate-id(.)=generate-id(key('values',normalize-space(.)))]"/>
</td>
</tr>
</xsl:for-each>
</table>
</html>
</xsl:template>
<xsl:template match="corr">
<xsl:if test="position() != 1">, </xsl:if>
<xsl:value-of select="."/>
</xsl:template>
</xsl:stylesheet>
Вывод
<html>
<table>
<tr>
<td>Hello</td>
<td>Helo, ello</td>
</tr>
<tr>
<td>week</td>
<td>wk, weeeek</td>
</tr>
<tr>
<td>for</td>
<td>forr</td>
</tr>
</table>
</html>
Комментарии:
1. О, спасибо, но элементы второго столбца не различаются (хотя это не относится к небольшому примеру XML, который я привел в вопросе ..)
2. @Nicolas — Извините за это. Я тестировал с процессором 2.0. Я исправил опечатку, и теперь она должна работать. (Протестировано с Xalan и Saxon 6.5.5)
3. @Nicolas — Если значения также должны быть разными, вы можете добавить другое
xsl:key
. Я обновлю свой ответ.4. @Nicolas — Я внес еще одно редактирование для нормализации пространства. Попробуйте еще раз. Если после этого все еще возникают проблемы, пожалуйста, обновите свой вопрос с помощью некоторого ввода XML, с помощью которого я могу воспроизвести проблемы.