我有一个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>
有人能指出我正确的方向吗?
答案 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>