首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为每一个选择任意的兄弟姐妹

为每一个选择任意的兄弟姐妹
EN

Stack Overflow用户
提问于 2011-12-02 22:12:54
回答 1查看 144关注 0票数 1

我正在循环遍历一个节点集合,每个节点都有两个元素,并希望为每个组输出一个两列表。该表按字母顺序排序,从第一列向下,然后向下第二列。我对第一个元素进行分组,然后在两列中输出每个第二个元素。

示例数据源:

代码语言:javascript
复制
<ArrayOfEIS_CT_AssignmentByRegion
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <EIS_CT_AssignmentByRegion>
        <Region>MIDDLE EAST, NORTH AFRICA and EUROPE</Region>            
        <CountryName>IRAQ</CountryName>            
    </EIS_CT_AssignmentByRegion>
    <EIS_CT_AssignmentByRegion>
        <Region>MIDDLE EAST, NORTH AFRICA and EUROPE</Region>
        <CountryName>JORDAN</CountryName>
    </EIS_CT_AssignmentByRegion>
    <EIS_CT_AssignmentByRegion>
        <Region>MIDDLE EAST, NORTH AFRICA and EUROPE</Region>
        <CountryName>GAZA AND WEST BANK</CountryName>
    </EIS_CT_AssignmentByRegion>
    <EIS_CT_AssignmentByRegion>
        <Region>MIDDLE EAST, NORTH AFRICA and EUROPE</Region>
        <CountryName>KUWAIT</CountryName>
    </EIS_CT_AssignmentByRegion>    
    <EIS_CT_AssignmentByRegion>
        <Region>SUBSAHARAN AFRICA</Region>
        <CountryName>TOGO</CountryName>
    </EIS_CT_AssignmentByRegion>
    <EIS_CT_AssignmentByRegion>
        <Region>SUBSAHARAN AFRICA</Region>
        <CountryName>ZIMBABWE</CountryName>
    </EIS_CT_AssignmentByRegion>
    <EIS_CT_AssignmentByRegion>
        <Region>SUBSAHARAN AFRICA</Region>
        <CountryName>ZAMBIA</CountryName>
    </EIS_CT_AssignmentByRegion>
    <EIS_CT_AssignmentByRegion>
        <Region>SUBSAHARAN AFRICA</Region>
        <CountryName>UGANDA</CountryName>
    </EIS_CT_AssignmentByRegion>
</ArrayOfEIS_CT_AssignmentByRegion>

XSLT:

代码语言:javascript
复制
<xsl:stylesheet version="1.0"
                xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns:w="http://schemas.microsoft.com/office/word/2006/wordml">
    <xsl:output method="xml" indent="yes" encoding="utf-8"/>    
    <xsl:key name="list-by-region" match="EIS_CT_AssignmentByRegion" use="concat(generate-id(..), '|', Region)"/>
    <xsl:template match="/ArrayOfEIS_CT_AssignmentByRegion">
        <html>
            <body>
                <xsl:for-each select="EIS_CT_AssignmentByRegion[generate-id() = generate-id(key('list-by-region', concat(generate-id(..), '|', Region))[1])]">                    
                    <xsl:sort select="Region" />
                    <xsl:sort select="CountryName" />
                    <xsl:variable name="halfIndex" select="floor(count(key('list-by-region', concat(generate-id(..), '|', Region))) div 2)" />
                    <table>
                        <thead>
                            <tr>
                                <th colspan="2">
                                    <xsl:value-of select="Region" />
                                </th>
                            </tr>
                        </thead>
                        <tbody>
                            <xsl:for-each select="key('list-by-region', concat(generate-id(..), '|', Region))">
                                <xsl:sort select="CountryName" />
                                <xsl:variable name="countryColumn2" select="following-sibling::*[position() = $halfIndex]" />
                                <xsl:if test="position() &lt;= $halfIndex">
                                    <tr>
                                        <td>
                                            <xsl:value-of select="CountryName" />
                                        </td>
                                        <td>
                                            <xsl:value-of select="$countryColumn2" />
                                        </td>
                                    </tr>
                                </xsl:if>
                            </xsl:for-each>
                        </tbody>
                    </table>
                </xsl:for-each>
            </body>
        </html>
    </xsl:template>
</xsl:stylesheet>

我想要的输出是:

代码语言:javascript
复制
    <html>
    <body>
    <table>
        <thead>
            <tr>
                <th colspan="2">
                    MIDDLE EAST, NORTH AFRICA and EUROPE
                </th>
            </tr>
        </thead>
        <tbody>
            <tr>
                <td>
                    GAZA AND WEST BANK
                </td>
                <td>
                    JORDAN
                </td>
            </tr>
            <tr>
                <td>
                    IRAQ
                </td>
                <td>
                    KUWAIT
                </td>
            </tr>
        </tbody>
    </table>
    <table>
        <thead>
            <tr>
                <th colspan="2">
                    SUBSAHARAN AFRICA
                </th>
            </tr>
        </thead>
        <tbody>
            <tr>
                <td>
                    TOGO
                </td>
                <td>
                    ZAMBIA
                </td>
            </tr>
            <tr>
                <td>
                    UGANDA
                </td>
                <td>
                    ZIMBABWE
                </td>
            </tr>
        </tbody>
    </table>
    </body>
</html>

我的方法是只处理每组的一半,并从下半部分中选择国家并在第二栏中输出。我的问题是,对于的一些团体来说,选择的国家是错误的。通常,一个国家是从另一个群体中挑选出来的。

为了进行测试,我做了一次运行,按照顺序输出所有国家,单列,并且它们被正确地分组和排序。所以这条线

代码语言:javascript
复制
<xsl:variable name="countryColumn2" 
     select="following-sibling::*[position() = $halfIndex]" />

对于某些组,保留当前上下文以选择同级节点。有什么想法吗?谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-12-03 04:13:57

对于某些组,保留当前上下文以选择同级节点。有什么想法吗?

问得好,+1。

使用<xsl:sort> 进行排序不会更改文档中节点之间的原始同级关系。

因此,对于两个节点:node1及其后续的同级node2,,尽管node1作为排序的结果出现在node2之后,但node2仍然是node1的后续同级。

解决方案

  1. Pass1:输出临时树中排序的结果,在这个树中,节点之间的兄弟关系准确地反映了它们的排序,order.
  2. Pass2:在第一次传递的结果第二次传递时继续进行处理。现在,您可以按照预期的方式使用同级轴。
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8363345

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档