Как перечислить РАЗЛИЧНЫЕ значения атрибутов и их значения элементов?

#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, с помощью которого я могу воспроизвести проблемы.