【问题标题】:Group child nodes based on the values of their siblings根据兄弟节点的值对子节点进行分组
【发布时间】:2020-02-12 20:09:33
【问题描述】:

我有这个 XML:

<RECORDS>
    <RETREC>
        <heading>Green Fruits</heading>
        <message>Kiwi</message>
    </RETREC>
    <RETREC>
        <heading>Green Fruits</heading>
        <message>Apple</message>
    </RETREC>
    <RETREC>
        <heading>Red Fruits</heading>
        <message>Apple</message>
    </RETREC>
    <RETREC>
        <heading>Red Fruits</heading>
        <message>Strawberry</message>
    </RETREC>
</RECORDS>

我想创建一个 XSLT 1.0 模板来获取这个 HTML:

<table>
<tr><th>Green Fruits</th></tr>
<tr><td>Kiwi</td></tr>
<tr><td>Apple</td></tr>
<tr><th>Red Fruits</th></tr>
<tr><td>Apple</td></tr>
<tr><td>Strawberry</td></tr>
</table>

到目前为止,我已经根据另一篇 Stack Overflow 帖子得到了这个结果,但我无法找到原始数据与此结构匹配的那个,而且我对它的理解还不够,不知道如何修改它以使其工作.

<?xml version="1.0" ?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">

    <xsl:key name="heading" match="RECORDS" use="@heading" />

    <xsl:template match="/">
        <div>
        <xsl:choose>
            <xsl:when test="count(/RECORDS/RETREC)>=1">
                <body>
                <center>
                <table>        

                    <xsl:template match="RECORDS">

                            <xsl:apply-templates select="/RETREC/heading[generate-id(.)=generate-id(key('heading',@heading)[1])]"/>

                    </xsl:template>

                    <xsl:template match="heading">

                            <xsl:for-each select="key('heading', @heading)">

                                <tr>
                                    <th align="center"><xsl:value-of select="heading" disable-output-escaping="yes"/></th>  
                                </tr>

                                <xsl:for-each select="RETREC">

                                    <tr>
                                    <td align="center"><xsl:value-of select="message" disable-output-escaping="yes"/></td>  
                                    </tr>

                                </xsl:for-each>

                            </xsl:for-each>

                            <tr>
                                <td>&#xa0;</td> <!-- Adds a blank line in between heading -->
                            </tr>

                    </xsl:template>

                </table>
                </center>
                </body>
            </xsl:when>                 
            <xsl:otherwise>
                <xsl:value-of select="/text()"/>
                <p id="No_return">No Records</p>
            </xsl:otherwise>
        </xsl:choose>
        </div>
    </xsl:template>

</xsl:stylesheet>

【问题讨论】:

    标签: xml xslt xslt-1.0


    【解决方案1】:

    您显示的输出可以简单地通过以下方式生成:

    XSlT 1.0

    <xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="html"/>
    
    <xsl:key name="heading" match="RETREC" use="heading" />
    
    <xsl:template match="/RECORDS">
        <table>
            <xsl:for-each select="RETREC[generate-id(.)=generate-id(key('heading', heading)[1])]">
                <tr>
                    <th>
                        <xsl:value-of select="heading"/>
                    </th>  
                </tr>
                <xsl:for-each select="key('heading', heading)">
                    <tr>
                        <td>
                            <xsl:value-of select="message" />
                        </td>  
                    </tr>
                </xsl:for-each>
            </xsl:for-each>
        </table>
    </xsl:template>
    
    </xsl:stylesheet>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多