Мне нужно отображать БОЛЬШОЙ на планетах с диаметром больше среднего или МАЛЕНЬКИЙ без использования функции avg (XSLT 1.0)
Я пытался использовать xsl: при условии, что диаметр> сумма (....) div count (nom), но это не работает:
<xsl:stylesheet version = "1.0"
xmlns:xsl = "http://www.w3.org/1999/XSL/Transform">
<xsl:output method = "html"/>
<xsl:template match = "/systeme_solaire">
<html lang = "fr">
<head>
<title>Les planètes</title>
</head>
<body>
<xsl:apply-templates select = "planete[nom!='Terre']">
<xsl:sort select = "diametre" order = "descending" data-type = "number" />
</xsl:apply-templates>
</body>
</html>
</xsl:template>
<xsl:template match = "planete" >
<ul>
<p><b><xsl:value-of select = "nom"/> : </b></p>
<li>Distance au soleil: <xsl:value-of select = "distance"/><xsl:value-of select = "distance/@unit"/></li>
<li>Masse: <xsl:value-of select = "masse"/> <xsl:value-of select = "masse/@unit"/></li>
<li>
<xsl:choose>
<xsl:when test = "diametre > ((sum(diametre[unit='diamètre terrestre']*sum(diametre[unit='km']))+sum(diametre[unit='km'])) div count(nom))">
BIG
</xsl:when>
<xsl:otherwise>
SMALL
</xsl:otherwise>
</xsl:choose> Diamètre: <xsl:value-of select = "diametre"/> <xsl:value-of select = "diametre/@unit"/></li>
<xsl:if test = "satellite>0"><li>Nombre de satellites: <xsl:value-of select = "satellite"/></li></xsl:if>
</ul>
</xsl:template>
</xsl:stylesheet>Используемый XML-файл (диаметр планет, отличных от Земли, определяется в соответствии с соотношением диаметров Земли):
<?xml version = "1.0" encoding = "ISO-8859-1" ?>
<systeme_solaire>
<planete type = "tellurique">
<nom>Vénus</nom>
<distance unit = "UA" >0.7</distance>
<masse unit = "masse terrestre">0.8</masse>
<diametre unit = "diamètre terrestre">0.9</diametre>
</planete>
<planete type = "tellurique">
<nom>Terre</nom>
<distance unit = "km" >149600000</distance>
<masse unit = "kg">5.98e24</masse>
<diametre unit = "km">12756</diametre>
<satellite>1</satellite>
</planete>
<planete type = "tellurique">
<nom>Mars</nom>
<distance unit = "UA" >1.5</distance>
<masse unit = "masse terrestre">0.1</masse>
<diametre unit = "diamètre terrestre">0.5</diametre>
<satellite>2</satellite>
</planete>
</systeme_solaire>





У вас две проблемы:
planete, чтобы достичь всех планет, а затем пройти этот
средний для вас шаблонunit - это атрибут, поэтому вам нужно использовать @. Вам понадобится что-то вроде этого: ((sum(//diametre[@unit='diamètre
terrestre'])*//diametre[@unit='km'])+//diametre[@unit='km']) div
count(//nom)<xsl:with-param name = "terre" select = "//diametre[@unit='km']"/> и используя его <xsl:when test = "diametre*$terre > $avg">Я обновил вам XSLT вот так:
Решение 1
<xsl:stylesheet version = "1.0"
xmlns:xsl = "http://www.w3.org/1999/XSL/Transform">
<xsl:output method = "html"/>
<xsl:template match = "/systeme_solaire">
<html lang = "fr">
<head>
<title>Les planètes</title>
</head>
<body>
<xsl:apply-templates select = "planete[nom!='Terre']">
<xsl:sort select = "diametre" order = "descending" data-type = "number" />
<xsl:with-param name = "avg" select = "((sum(//diametre[@unit='diamètre terrestre'])*//diametre[@unit='km'])+//diametre[@unit='km']) div count(//nom)"/>
<xsl:with-param name = "terre" select = "//diametre[@unit='km']"/>
</xsl:apply-templates>
</body>
</html>
</xsl:template>
<xsl:template match = "planete" >
<xsl:param name = "avg"/>
<xsl:param name = "terre"/>
<ul>
<p><b><xsl:value-of select = "nom"/> : </b></p>
<li>Distance au soleil: <xsl:value-of select = "distance"/><xsl:value-of select = "distance/@unit"/></li>
<li>Masse: <xsl:value-of select = "masse"/> <xsl:value-of select = "masse/@unit"/></li>
<li>
<xsl:choose>
<xsl:when test = "diametre*$terre > $avg">
BIG
</xsl:when>
<xsl:otherwise>
SMALL
</xsl:otherwise>
</xsl:choose> Diamètre: <xsl:value-of select = "diametre"/> <xsl:value-of select = "diametre/@unit"/></li>
<xsl:if test = "satellite>0"><li>Nombre de satellites: <xsl:value-of select = "satellite"/></li></xsl:if>
</ul>
</xsl:template>
</xsl:stylesheet>
Редактировать, чтобы добавить предложение Майкла (рассчитайте средний диаметр как отношение):
Решение 2
<xsl:apply-templates select = "planete[nom!='Terre']">
<xsl:sort select = "diametre" order = "descending" data-type = "number" />
<xsl:with-param name = "avg" select = "(sum(//diametre[@unit='diamètre terrestre'])+1) div count(//nom)"/>
</xsl:apply-templates>
...
<xsl:template match = "planete" >
<xsl:param name = "avg"/>
...
<xsl:when test = "diametre > $avg">
...
Спасибо, для другого файла xml, я создал переменную с первой буквой в верхнем регистре, и я пытаюсь использовать xsl: apply-templates для ее отображения, но это не работает: <xsl: variable name = "$ nomUpper" select = "concat (translate (substring (nom / text (), 1,1), $ smallcase, $ uppercase), substring (nom / text (), 2), substring ('', 1 div not (position () = last ()))) "/> <xsl: apply-templates select = " $ nomUpper "/>
Не уверен, что вы здесь пытаетесь сделать, но select в apply-template используется для обработки узлов, выбранных выражением, а не переменной. Если вы хотите передать переменную в шаблон, используйте xsl:with-param в apply-template и xsl:param в шаблоне, как в ответе выше. Также, если это отвечает на ваш вопрос, пожалуйста, примите его и создайте еще один вопрос для любой новой проблемы.
Поскольку Земля исключена, я не понимаю, почему вам нужно использовать настоящие единицы. Просто рассчитайте средний диаметр как отношение.
@ michael.hor257k Вы правы, я просто использовал тот же расчет, что и Маурис, но в этом случае нам не нужно пересчитывать диаметр или другой параметр.
Когда я пытаюсь запустить решение 1, кажется, что оно не работает: ничего не отображается
К сожалению, я забыл строчку в моем редакторе <xsl:param name = "terre"/>
Я отредактировал свой ответ, чтобы учесть, что диаметр, который вы проверяете, нужно умножить на диаметр земли.