У меня есть XML-файл, который выглядит следующим образом ...
<states>
<state>
<name>North Carolina</name>
<city>Charlotte</city>
</state>
<state>
<name>Alaska</name>
<city>Fairbanks</city>
</state>
<state>
<name>Virginia</name>
<city>Leesburg</city>
</state>
<state>
<name>Alaska</name>
<city>Coldfoot</city>
</state>
<state>
<name>North Carolina</name>
<city>Harrisburg</city>
</state>
<state>
<name>Virginia</name>
<city>Ashburn</city>
</state>
</states>
Мне нужно создать отчет, в котором перечислены все штаты, в алфавитном порядке с каждым городом, следующим ...., например..
Alaska - Fairbanks, Coldfoot
North Carolina - Charlotte, Harrisburg
Virginia - Leesburg, Ashburn
(города не должны быть в альфа-порядке, только штаты)
Я попытался решить эту проблему, выполнив для каждого состояния / состояния, отсортировав ихпо имени и обработке его.Вот так ....
<xsl:for-each select="states/state">
<xsl:sort select="name" data-type="text" order="ascending"/>
<xsl:value-of select="name"/>-<xsl:value-of select="city"/>
</xsl:for-each>
Это дало мне ....
Alaska - Fairbanks
Alaska - Coldfoot
North Carolina - Charlotte
North Carolina - Harrisburg
Virginia - Leesburg
Virginia - Ashburn
Сортировка сработала, теперь я хочу сгруппировать.Единственное, что я мог подумать, это сравнить с предыдущим состоянием, так как оно отсортировано, оно должно распознавать, не изменилось ли значение состояния.Вот так ...
<xsl:for-each select="states/state">
<xsl:sort select="name" data-type="text" order="ascending"/>
<xsl:variable name="name"><xsl:value-of select="name">
<xsl:variable name="previous-name"><xsl:value-of select="(preceding-sibling::state)/name">
<xsl:if test="$name != $previous-name">
<br/><xsl:value-of select="name"/>-
</xsl:if>
<xsl:value-of select="city"/>
</xsl:for-each>
К сожалению, похоже, что функция предыдущего брата не очень хорошо работает с сортировкой, поэтому в первый раз (на первой Аляске) она увидела первую Северную Каролинукак предыдущий брат.Это вызывает некоторые странные результаты, которые мне совсем не понравились.
Итак, я использую XSLT1.0 ... Есть мысли / предложения?
Спасибо