Исходный XML:
<data> <item> <values> <element1> <language>EN</language> <text>text</text> </element1> <element2> <language>DE</language> <text>Text</text> </element2> </values> </item> <item> <values> <element5> <language>EN</language> <text>description</text> </element5> <element6> <language>DE</language> <text>Beschreibung</text> </element6> </values> </item> </data>
Я хочу получить все элементы на языке «EN». Сначала у меня есть цикл, в котором я сохраняю имена элементов в переменной. На следующем шаге я хочу получить только элементы на языке "EN". В результате этого шага мне нужно только имя элемента и текст, которые имеют язык «EN» для построения таблицы.
Я пробовал это:
<xsl:param name = "element" select = "'element1'"/>
<xsl:template match = "/">
<xsl:if test = "data/item/values[local-name()=$element]/language[text()='EN']">
</xsl:if>
</xsl:template>
И выходной XSLT должен быть примерно таким:
<table id = "123">
<tgroup cols = "2">
<colspec colname = "c1" colnum = "1" colwidth = "1.0*"/>
<colspec colname = "c2" colnum = "2" colwidth = "1.0*"/>
<thead>
<row>
<entry>Name</entry>
<entry>Values</entry>
</row>
</thead>
<tbody>
<row>
<entry>
<ph>element1</ph>
</entry>
<entry>text</entry>
</row>
<row>
<entry>
<ph>element5</ph>
</entry>
<entry>description</entry>
</row>
</tbody>
</tgroup>
</table>
Я знаю, что есть другие способы решить эту проблему. А вот для других шагов преобразования важно проверить каждый элемент отдельно.
Заранее спасибо!
Ну конечно; естественно!
Итак, первая часть проблемы заключается в фильтрации/выборе элементов по значению параметра? Или вы хотите вывести каждый элемент language = 'EN'?





<xsl:output method = "xml" indent = "yes"/>
<xsl:template match = "data">
<xsl:for-each-group select = "item" group-by = "values/*[language = 'EN']">
<xsl:for-each select = "current-group()">
<xsl:element name = "{current-group()/values/*[language = 'EN']/local-name()}">
<language>
<xsl:value-of select = "descendant::language[text() = 'EN']"/>
</language>
<txt>
<xsl:value-of select = "current-group()/values/*[language = 'EN']/text"/>
</txt>
</xsl:element>
</xsl:for-each>
</xsl:for-each-group>
</xsl:template>
You may do like this
<?xml version = "1.0" encoding = "utf-8"?>
<xsl:stylesheet xmlns:xsl = "http://www.w3.org/1999/XSL/Transform"
xmlns:exsl = "http://exslt.org/common" version = "1.0">
<xsl:output indent = "yes" />
<xsl:strip-space elements = "*" />
<xsl:template match = "/">
<xsl:variable name = "ENelements">
<xsl:for-each select = "/data/item/values/*[language='EN']">
<element name = "{local-name()}"><xsl:value-of select = "text" /></element>
</xsl:for-each>
</xsl:variable>
<table id = "123">
<tgroup cols = "2">
<colspec colname = "c1" colnum = "1" colwidth = "1.0*"/>
<colspec colname = "c2" colnum = "2" colwidth = "1.0*"/>
<thead>
<row>
<entry>Name</entry>
<entry>Values</entry>
</row>
</thead>
<tbody>
<xsl:for-each select = "exsl:node-set($ENelements)/*">
<row>
<entry>
<ph><xsl:value-of select = "@name" /></ph>
</entry>
<entry><xsl:value-of select = "." /></entry>
</row>
</xsl:for-each>
</tbody>
</tgroup>
</table>
</xsl:template>
</xsl:stylesheet>
AFAICT, это может быть просто:
XSLT 1.0
<xsl:stylesheet version = "1.0"
xmlns:xsl = "http://www.w3.org/1999/XSL/Transform">
<xsl:output method = "xml" version = "1.0" encoding = "UTF-8" indent = "yes"/>
<xsl:template match = "/data">
<table id = "123">
<tgroup cols = "2">
<colspec colname = "c1" colnum = "1" colwidth = "1.0*"/>
<colspec colname = "c2" colnum = "2" colwidth = "1.0*"/>
<thead>
<row>
<entry>Name</entry>
<entry>Values</entry>
</row>
</thead>
<tbody>
<xsl:for-each select = "item">
<xsl:variable name = "elem" select = "values/*[language='EN']" />
<row>
<entry>
<ph>
<xsl:value-of select = "name($elem)"/>
</ph>
</entry>
<entry>
<xsl:value-of select = "$elem/text"/>
</entry>
</row>
</xsl:for-each>
</tbody>
</tgroup>
</table>
</xsl:template>
</xsl:stylesheet>
Можете ли вы отредактировать свой вопрос, чтобы показать фактический результат, который вы ожидаете в этом случае? Спасибо!