Проверка, существует ли определенный тип ненулевого элемента ... где-то

У меня есть XML, который выглядит как

<answers>
   <answer>
      <question-number>1</question-number>
      <value>3</value>
      <mean xsi:nil = "1" />
    </answer>
   <answer>
      <question-number>2</question-number>
      <value>2</value>
      <mean>2.3</mean>
    </answer>
   <answer>
      <question-number>3</question-number>
      <value>3</value>
      <mean xsi:nil = "1" />
    </answer>
....
</answers>

Я форматирую каждый ответ, используя xsl: for-each. Если есть среднее значение, у меня есть графическое представление среднего. Для некоторых возможных списков ответов среднее значение всегда будет нулевым.

Внизу страницы я хочу поместить легенду, объясняющую графическое представление среднего. Но я хочу, чтобы он отображался только в том случае, если я вообще отображал среднее значение. Поэтому я хочу иметь возможность после закрытия xsl: for-each выполнить проверку, чтобы сказать «имеет ли какой-либо из элементов ответа ненулевое среднее значение?».

На самом деле не знаю, как это сделать.

Почему у вас есть элемент зла, когда нет ничего плохого? Конечно, было бы больше смысла в отсутствии всего атрибута в случае отсутствия среднего значения, чем в присвоении ему произвольного «нулевого» значения.

workmad3 09.10.2008 19:38

Честная оценка. Я попытаюсь атаковать его и с этого направления, но это XML, который генерируется сериализатором, который использовал этот проект (до меня). xsi: nil предназначен для обозначения того, что элемент, который обычно не является пустым, должен быть пустым. Может, я смогу это выключить.

Jacob Mattison 09.10.2008 19:51
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
2
5 966
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

Что-то вроде этого должно работать. если у вас есть средства, он вернет истину

<xs:if test = "/answers/answer/mean">You have a mean</xs:if>

Я думаю, вы это имеете в виду.

Обновлено: может быть, это?

<xs:if test = "(count(/answers/answer/mean)==1)">You have a mean<xs:if>

Не уверен, что это сработает, но может

<xs:if test = "/answers/answer/mean != nil">You have a mean</xs:if>

Кажется, это проверяет, есть ли какой-либо элемент с именем mean, независимо от того, является ли он нулевым или нет. В моем примере XML выше, если все "средние" элементы имели xsi: nil = "1", то я не хочу отображать, однако спасибо!

Jacob Mattison 09.10.2008 19:40

Может быть, я мог бы проверить наличие «элемента» на один уровень ниже среднего - например, test = "answers / answer / mean / *"? Я попробую это.

Jacob Mattison 09.10.2008 19:42

Нет, похоже, это никогда не отображается.

Jacob Mattison 09.10.2008 19:42

Этот добавленный вами тест - «(count (/ answers / answer / mean) == 1)» - привел к следующей ошибке: «Путь к местоположению ожидался, но обнаружен следующий токен: =»

Jacob Mattison 09.10.2008 20:08

И следующий, который вы добавили - «/ answers / answer / mean! = Nil» - похоже, никогда не отображается. Спасибо хоть!

Jacob Mattison 09.10.2008 20:10

имеет ли какой-либо из элементов ответа ненулевое среднее значение? на примере Робертса

<xs:if test = "(count(/answers/answer/mean[not(@xsi:nil)])>0"><xs:if>

Обновлено:

<xs:if test = "//answer/mean[not(text())]"><xs:if>

ПОСЛЕДНЕЕ РЕДАКТИРОВАНИЕ (перед уходом домой ...)

<xs:if test = "//answer/mean[attribute::xsi:nil]"><xs:if>

имеет смысл для меня - хорошее повторение моего вопроса - но на самом деле он никогда не отображается при использовании этого теста.

Jacob Mattison 09.10.2008 20:05

Второй, который вы опубликовали, - not (// answer / mean / text ()) - кажется, все время возвращает true.

Jacob Mattison 09.10.2008 20:22

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

Jasper 09.10.2008 20:30

Попробуйте этот whitebeam.org/library/guide/TechNotes/xpathtestbed.rhtm для проверки выражений. Также поддерживает пространства имен

Jasper 09.10.2008 20:32

Что насчет этого?

  <xsl:for-each select = "/answers/answer">
      <xsl:if test = "mean &gt;= 0">
          ... other code ...
      </xsl:if>
  </xsl:for-each>

Разве это не приведет к тому, что моя легенда будет отображаться один раз каждый раз, когда есть ненулевое среднее значение? Я хочу, чтобы он отображался один раз, только если есть какие-либо ненулевые средства вообще, и в противном случае не отображался.

Jacob Mattison 09.10.2008 20:12

Да, вам нужно, чтобы это происходило вне цикла for-each, как указано в ответе ниже.

Dave DuPlantis 09.10.2008 22:23

<xs:if test = "count(/answers/answer/mean[@xsi:nil != '1']) > 0">Mean stuff here</xs:if>

Должен делать то, что вы хотите (посчитайте средства, в которых атрибут xsi: nil не установлен в 1)

Хм. Как и в случае с Джаспером, это имеет смысл и должно работать, но оно никогда не отображается (т.е. никогда не возвращает истину, даже если некоторые из средних элементов имеют числовое значение). Я буду продолжать исследовать этот подход.

Jacob Mattison 09.10.2008 20:16
Ответ принят как подходящий

Вот что наконец сработало для меня:

<xsl:if test = "//answers/answer/mean>0">

Иными словами, «существуют ли какие-либо элементы ответа, для которых среднее значение больше нуля». К счастью, я знаю, что среднее значение, если оно есть, на самом деле всегда будет больше нуля - к сожалению, по этой причине это не обобщенное решение.

Я все еще думаю, что подход, который использовали jasper и workmad3 (проверка атрибута xsi: nil), должен работать, но я не мог заставить синтаксис действительно ... работать.

Большое спасибо всем.

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