#xml #xslt #xslt-1.0
#xml #xslt #xslt-1.0
Вопрос:
У меня есть некоторые значения в моем XML-файле, которые пропускаются.. По сути, то, что я хочу сделать, это перечислить каждое значение в теге «abrev» в одном столбце, а в другом столбце их соответствующее значение атрибута «forme». Все элементы в обоих столбцах должны РАЗЛИЧАТЬСЯ.
Комментарии:
1. Какое из них пропускается? Можете ли вы предоставить XML меньшего размера для воспроизведения проблемы?
Ответ №1:
Попробуйте это так:
<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="formes" match="abrev" use="@forme"/>
<xsl:key name="values" match="abrev" use="concat(@forme, '|', normalize-space(.))"/>
<xsl:template match="/">
<html>
<table>
<xsl:for-each select="//abrev[generate-id(.)=generate-id(key('formes',@forme))]">
<tr>
<td>
<xsl:value-of select="@forme"/>
</td>
<td>
<xsl:apply-templates select="key('formes',@forme)[generate-id(.)=generate-id(key('values',concat(@forme, '|', normalize-space(.))))]"/>
</td>
</tr>
</xsl:for-each>
</table>
</html>
</xsl:template>
<xsl:template match="abrev">
<xsl:if test="position() != 1">, </xsl:if>
<xsl:value-of select="."/>
</xsl:template>
</xsl:stylesheet>
Кстати, насколько сложно свести пример к:
<collection>
<abrev forme="mais">ms</abrev>
<abrev forme="Mais">ms</abrev>
</collection>
Комментарии:
1. Спасибо, все работает просто отлично! Я не знал, в чем именно была проблема, поэтому я не мог придумать небольшой пример
Ответ №2:
Вы создали два <xsl:key>
элемента. Второй использует в качестве ключа значение элемента.
В следующем блоке во время итерации элемента с forme="Mais"
вами выберите values
элемент, соответствующий "ms"
значению, и проверьте, соответствует ли он текущему элементу.
<xsl:apply-templates
select="key('formes',@forme)[generate-id(.)=generate-id(key('values',normalize-space(.)))]"/>
Это не так, потому "ms"
что значение связано с этим abrev
элементом:
<abrev forme="mais">ms</abrev> sinon<ponc forme=","/>
Поскольку результат предиката равен false, шаблон не будет вызван и <td>
будет пустым.