У меня есть 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 выполнить проверку, чтобы сказать «имеет ли какой-либо из элементов ответа ненулевое среднее значение?».
На самом деле не знаю, как это сделать.
Честная оценка. Я попытаюсь атаковать его и с этого направления, но это XML, который генерируется сериализатором, который использовал этот проект (до меня). xsi: nil предназначен для обозначения того, что элемент, который обычно не является пустым, должен быть пустым. Может, я смогу это выключить.





Что-то вроде этого должно работать. если у вас есть средства, он вернет истину
<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", то я не хочу отображать, однако спасибо!
Может быть, я мог бы проверить наличие «элемента» на один уровень ниже среднего - например, test = "answers / answer / mean / *"? Я попробую это.
Нет, похоже, это никогда не отображается.
Этот добавленный вами тест - «(count (/ answers / answer / mean) == 1)» - привел к следующей ошибке: «Путь к местоположению ожидался, но обнаружен следующий токен: =»
И следующий, который вы добавили - «/ answers / answer / mean! = Nil» - похоже, никогда не отображается. Спасибо хоть!
имеет ли какой-либо из элементов ответа ненулевое среднее значение? на примере Робертса
<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>
имеет смысл для меня - хорошее повторение моего вопроса - но на самом деле он никогда не отображается при использовании этого теста.
Второй, который вы опубликовали, - not (// answer / mean / text ()) - кажется, все время возвращает true.
Я вижу, что вторая скопирована не с той страницы;). Второй и третий (сейчас) должны дать вам одинаковый набор узлов.
Попробуйте этот whitebeam.org/library/guide/TechNotes/xpathtestbed.rhtm для проверки выражений. Также поддерживает пространства имен
Что насчет этого?
<xsl:for-each select = "/answers/answer">
<xsl:if test = "mean >= 0">
... other code ...
</xsl:if>
</xsl:for-each>
Разве это не приведет к тому, что моя легенда будет отображаться один раз каждый раз, когда есть ненулевое среднее значение? Я хочу, чтобы он отображался один раз, только если есть какие-либо ненулевые средства вообще, и в противном случае не отображался.
Да, вам нужно, чтобы это происходило вне цикла for-each, как указано в ответе ниже.
<xs:if test = "count(/answers/answer/mean[@xsi:nil != '1']) > 0">Mean stuff here</xs:if>
Должен делать то, что вы хотите (посчитайте средства, в которых атрибут xsi: nil не установлен в 1)
Хм. Как и в случае с Джаспером, это имеет смысл и должно работать, но оно никогда не отображается (т.е. никогда не возвращает истину, даже если некоторые из средних элементов имеют числовое значение). Я буду продолжать исследовать этот подход.
Вот что наконец сработало для меня:
<xsl:if test = "//answers/answer/mean>0">
Иными словами, «существуют ли какие-либо элементы ответа, для которых среднее значение больше нуля». К счастью, я знаю, что среднее значение, если оно есть, на самом деле всегда будет больше нуля - к сожалению, по этой причине это не обобщенное решение.
Я все еще думаю, что подход, который использовали jasper и workmad3 (проверка атрибута xsi: nil), должен работать, но я не мог заставить синтаксис действительно ... работать.
Большое спасибо всем.
Почему у вас есть элемент зла, когда нет ничего плохого? Конечно, было бы больше смысла в отсутствии всего атрибута в случае отсутствия среднего значения, чем в присвоении ему произвольного «нулевого» значения.