Отображение вывода на основе значения атрибута тега xml

57
4

<?xml version="1.0" encoding="UTF-8"?>

<provinces>
<name num="5">Alberta</name>
<name num="3">British</name>
<name num="1">Manitoba</name>
<name num="4">New Brunswick</name>
<name num="2">Newfoundland</name>
</provinces>

Я хочу, чтобы

1. Manitoba
2. Newfoundland
3. British
4. New Brunswick
5. Alberta

Я использую следующий xslt

<?xml version="1.0" encoding="US-ASCII"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" />

<xsl:template match="provinces">
<xsl:apply-templates select="name" />
</xsl:template>

<xsl:template match="name">
<xsl:value-of select="position()" />
<xsl:text>. </xsl:text>
<xsl:value-of select="." />
</xsl:template>

</xsl:stylesheet>

Я знаю, что этот способ делать не дает моего желаемого результата, но это пока что я получил.

Я хочу разместить их на основе атрибута "num", как это сделать?

спросил(а) 2015-03-03T15:40:00+03:00 5 лет, 7 месяцев назад
1
Решение
59

Я хочу разместить их на основе атрибута "num", как это сделать?

Такая манипуляция называется сортировкой. Сортировка входных элементов внутри xsl:apply-templates - это то, что вам нужно:

<xsl:apply-templates select="name">
<xsl:sort select="@num"/>
</xsl:apply-templates>

Кроме того, чтобы избежать получения всего текста в одной строке, выведите символ новой строки, если текущий узел name не является последним.

Таблица стилей XSLT

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

<xsl:template match="provinces">
<xsl:apply-templates select="name">
<xsl:sort select="@num" data-type="number"/>
</xsl:apply-templates>
</xsl:template>

<xsl:template match="name">
<xsl:value-of select="concat(position(),'. ')" />
<xsl:value-of select="." />
<xsl:if test="position() != last()">
<xsl:text>
</xsl:text>
</xsl:if>
</xsl:template>

</xsl:stylesheet>

Текстовый вывод

1. Manitoba
2. Newfoundland
3. British
4. New Brunswick
5. Alberta

ответил(а) 2015-03-03T15:44:00+03:00 5 лет, 7 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема