如何列出属性及其元素值的DISTINCT值?

时间:2014-06-25 20:24:02

标签: xml xslt xslt-1.0

我有一个带有很长标签列表的XML代码,我想列出其标签中的每个值,以及它们各自的"形式"属性值。 ALL DISTINCTS

1 个答案:

答案 0 :(得分:2)

每当你想到"不同的价值观"在XSLT 1.0中,思考"键"和Muenchian分组。

示例:

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>