Почему пропускаются некоторые дочерние значения?

#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> будет пустым.