用Muenchian方法嵌套分组

时间:2016-04-07 08:51:33

标签: xml xslt xslt-1.0 muenchian-grouping

我有一个XML格式的静态数据集,它包含各种关系数据。我试图将数据反向重新排序为 UL列表,同时跳过不能达到的条目。

数据集:

<?xml version="1.0" encoding="utf-8" ?>
<data>
    <landmarks>
        <entry id="9932">
            <landmark-name>Statue of Liberty</landmark-name>
            <linked-city link-id="432">New York</linked-city>
        </entry>
        <entry id="3020">
            <landmark-name>WTC</landmark-name>
            <linked-city link-id="432">New York</linked-country>
        </entry>
        <entry id="5829">
            <landmark-name>Times Square</landmark-name>
            <linked-city link-id="432">New York</linked-country>
        </entry>
        <entry id="2348">
            <landmark-name>Eiffel Tower</landmark-name>
            <linked-city link-id="932">Paris</linked-country>
        </entry>
        <entry id="2348">
            <landmark-name>Hollywood</landmark-name>
            <linked-city link-id="458">Los Angeles</linked-country>
        </entry>
        <entry id="4592">
            <landmark-name>Museo Nacional de Antropología</landmark-name>
            <linked-city link-id="328">Mexico City</linked-country>
        </entry>
    </landmarks>
    <cities>
        <entry id="432">
            <city-name>New York</city-name>
            <linked-country link-id="21">United States</linked-country>
        </entry>
        <entry id="458">
            <city-name>Los Angeles</city-name>
            <linked-country link-id="21">United States</linked-country>
        </entry>
        <entry id="832">
            <city-name>Miami</city-name>
            <linked-country link-id="21">United States</linked-country>
        </entry>
        <entry id="932">
            <city-name>Paris</city-name>
            <linked-country link-id="58">France</linked-country>
        </entry>
        <entry id="392">
            <city-name>Nice</city-name>
            <linked-country link-id="58">France</linked-country>
        </entry>
        <entry id="328">
            <city-name>Mexico City</city-name>
            <linked-country link-id="2">Mexico</linked-country>
        </entry>
    </cities>
    <countries>
        <entry id="21">
            <country>United States</country>
        </entry>
        <entry id="42">
            <country>Canada</country>
        </entry>
        <entry id="2">
            <country>Mexico</country>
        </entry>
        <entry id="58">
            <country>France</country>
        </entry>
        <entry id="23">
            <country>Spain</country>
        </entry>
    </countries>
</data>

期望的结果:

<ul>
    <li>United States
        <ul>
            <li>New York
                <ul>
                    <li>Statue of Liberty</li>
                    <li>Times Square</li>
                    <li>WTC</li>
                </ul>
            </li>
            <li>Los Angeles
                <ul>
                    <li>Hollywood</li>
                </ul>
            </li>
        </ul>
    </li>
    <li>France
        <ul>
            <li>Paris
                <ul>
                    <li>Eiffel Tower</li>
                </ul>
            </li>
        </ul>
    </li>
    <li>Mexico
        <ul>
            <li>Mexico City
                <ul>
                    <li>Museo Nacional de Antropología</li>
                </ul>
            </li>
        </ul>
    </li>
</ul>

我需要能够从“地标”方面对数据进行分组,这意味着首先我们获得所有地标,然后查看他们所在的城市以及他们所在的国家/地区。正如我们填写列表中的城市零与之相关的地标应省略。此外,在最终结果中应省略没有地标的城市的国家(如上所示)。

我知道如何根据Muenchian方法在城市下划分地标,但是让我偏离轨道的是我现在需要将它们分组在国家之下,同时将它们交给那些没有任何城市或地标的国家。 / p>

有人能指出我正确的方向吗?

1 个答案:

答案 0 :(得分:0)

我不认为这是一个分组问题,而是您可以使用各种键来跟踪所有这些引用:

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

    <xsl:output method="html" indent="yes"/>

    <xsl:key name="ref-city" match="cities/entry" use="linked-country/@link-id"/>
    <xsl:key name="ref-mark" match="landmarks/entry" use="linked-city/@link-id"/>

    <xsl:template match="data">
        <ul>
            <xsl:apply-templates
                select="countries/entry"
            />
        </ul>
    </xsl:template>

    <xsl:template match="countries/entry">
        <xsl:variable name="cities" select="key('ref-city', @id)"/>
        <xsl:variable name="landmarks" select="key('ref-mark', $cities/@id)"/>
        <xsl:if test="$landmarks">
            <li>
                <xsl:value-of select="country"/>
                <ul>
                    <xsl:apply-templates select="$cities"/>
                </ul>
            </li>
        </xsl:if>
    </xsl:template>

    <xsl:template match="cities/entry">
        <xsl:variable name="landmarks" select="key('ref-mark', @id)"/>
        <xsl:if test="$landmarks">
            <li>
                <xsl:value-of select="city-name"/>
                <ul>
                    <xsl:apply-templates select="$landmarks"/>
                </ul>
            </li>
        </xsl:if>
    </xsl:template>

    <xsl:template match="landmarks/entry">
        <li>
            <xsl:value-of select="landmark-name"/>
        </li>
    </xsl:template>
</xsl:stylesheet>