Xpath с xsl: при тестировании

Мне нужно отображать БОЛЬШОЙ на планетах с диаметром больше среднего или МАЛЕНЬКИЙ без использования функции 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>
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Введение в CSS
Введение в CSS
CSS является неотъемлемой частью трех основных составляющих front-end веб-разработки.
Как выровнять Div по центру?
Как выровнять Div по центру?
Чтобы выровнять элемент <div>по горизонтали и вертикали с помощью CSS, можно использовать комбинацию свойств и значений CSS. Вот несколько методов,...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Travel Booking Angular Template один из лучших Travel & Tour booking template in the world. 30+ валидированных HTML5 страниц, которые помогут...
0
0
722
1

Ответы 1

У вас две проблемы:

  1. Сначала вам нужно рассчитать ваш средний диаметр за пределами шаблон planete, чтобы достичь всех планет, а затем пройти этот средний для вас шаблон
  2. Тогда ваш xpath неверен: неправильные скобки, 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">
   ...

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

Nesku 02.01.2019 12:15

Спасибо, для другого файла 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 "/>

mauris 02.01.2019 13:10

Не уверен, что вы здесь пытаетесь сделать, но select в apply-template используется для обработки узлов, выбранных выражением, а не переменной. Если вы хотите передать переменную в шаблон, используйте xsl:with-param в apply-template и xsl:param в шаблоне, как в ответе выше. Также, если это отвечает на ваш вопрос, пожалуйста, примите его и создайте еще один вопрос для любой новой проблемы.

Nesku 02.01.2019 13:40

Поскольку Земля исключена, я не понимаю, почему вам нужно использовать настоящие единицы. Просто рассчитайте средний диаметр как отношение.

michael.hor257k 02.01.2019 14:10

@ michael.hor257k Вы правы, я просто использовал тот же расчет, что и Маурис, но в этом случае нам не нужно пересчитывать диаметр или другой параметр.

Nesku 02.01.2019 14:35

Когда я пытаюсь запустить решение 1, кажется, что оно не работает: ничего не отображается

mauris 02.01.2019 20:26

К сожалению, я забыл строчку в моем редакторе <xsl:param name = "terre"/>

Nesku 02.01.2019 20:57

Другие вопросы по теме