Я пытаюсь стилизовать некоторые xml:
<campers>
<camper>
<firstname>James</firstname>
<lastname>West</lastname>
<gender>Boy</gender>
</camper>
<camper>
<firstname>Adam</firstname>
<lastname>West</lastname>
<gender>Boy</gender>
</camper>
<camper>
<firstname>Ann</firstname>
<lastname>Landers</lastname>
<gender>Girl</gender>
</camper>
<camper>
<firstname>Billy</firstname>
<lastname>Batson</lastname>
<gender>Boy</gender>
</camper>
<camper>
<firstname>Diana</firstname>
<lastname>Prince</lastname>
<gender>Girl</gender>
</camper>
</campers>
Я хочу отсортировать их по полу, а затем по имени, но я также хочу иметь заголовок по полу.Я не могу заставить это работать.Мой вывод должен выглядеть так:
Кемперы
Мальчики
Батсон, БиллиЗапад, АдамЗапад, Джеймс
Девушки
Ландерс, ЭннПринц, диана
Использование следующего xsl:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" indent="yes" version="1.0"/>
<xsl:template match="/">
<html>
<head><title>Camper list</title></head>
<body style="font-family:Arial,Helvetica,sans-serif;font-size:8pt;">
<h2>Campers</h2>
<xsl:apply-templates select="//camper">
<xsl:sort select="gender" />
<xsl:sort select="lastname" />
<xsl:sort select="firstname" />
</xsl:apply-templates>
</body>
</html>
</xsl:template>
<xsl:template match="camper">
<xsl:if test="not(gender = preceding::gender)">
<h3><xsl:value-of select="gender"/>s</h3>
</xsl:if>
<xsl:value-of select="lastname"/><xsl:text>, </xsl:text><xsl:value-of select="firstname"/><br />
</xsl:template>
</xsl:stylesheet>
К сожалению, мой вывод выглядит так:
Campers
Батсон, БиллиЗапад, Адам
Мальчики
Запад, Джеймс
Девочки
Ландерс, ЭннПринц, диана
Я уверен, что я делаю что-то не так с сортировкой, или сортировка не используется, как я ожидаю.Любые предложения помогут.
Спасибо,
Дэвид
Приложение: Основываясь на решении lwburk, вот что я придумал:
<xsl:key name="campers-by-gender" match="camper" use="gender" />
<xsl:template match="/">
<html>
<head><title>Camper xsl test</title></head>
<body style="font-family:Arial,Helvetica,sans-serif;font-size:8pt;">
<h2>Campers</h2>
<xsl:apply-templates />
</body>
</html>
</xsl:template>
<xsl:template match="campers">
<xsl:for-each select="camper[count(. | key('campers-by-gender', gender)[1]) = 1]">
<h3><xsl:value-of select="key('campers-by-gender', gender)/gender"/>s</h3>
<xsl:for-each select="key('campers-by-gender', gender)">
<xsl:sort select="lastname" />
<xsl:sort select="firstname" />
<xsl:value-of select="lastname"/><xsl:text>, </xsl:text><xsl:value-of select="firstname"/><br />
</xsl:for-each>
</xsl:for-each>
</xsl:template>
Спасибо за помощь и хорошие идеи!D.