Разберите XML, чтобы получить тег, имеющий определенную подстроку [duplicate]

Нет HTML-решения. По спецификации HTML 4.01 поведение браузера не определено, если ни один из элементов option не имеет атрибута selected, и что на самом деле браузеры делают так, что они делают первый вариант предварительно выбранным.

As обходной путь, вы можете заменить элемент select на набор элементов input type=radio (с тем же name атрибутом). Это создает контроль одного и того же типа, но с другим внешним видом и пользовательским интерфейсом. Если ни один из элементов input type=radio не имеет атрибута checked, ни один из них изначально не выбран в большинстве современных браузеров.

39
задан Ben Everard 17 November 2010 в 10:36
поделиться

4 ответа

Это правильное выражение XPath 1.0, которое выбирает элемент с последним 5 символами, равным «_cost» в любом пространстве имен.

/data/stats/*[substring(name(), string-length(name()) - 4) = '_cost']
62
ответ дан user 19 August 2018 в 16:26
поделиться
  • 1
    Справедливая точка, я ввел это в свое приложение, и он делает то, что мне нужно, без других недостатков, см. Мой комментарий к reqsquare. Благодарю. – Ben Everard 17 November 2010 в 15:14
  • 2
    @ILMV: Добро пожаловать. Я рад, что это тебе помогает. – user 17 November 2010 в 15:47
  • 3
    +1 и благодаря @ user357812 - это было очень полезно для моего аналогичного варианта использования (суффикса атрибутов). Как это сделать здесь , если кому-то интересно. – halfer 8 October 2011 в 13:18
  • 4
    другой довольный клиент (-: – robert 17 October 2013 в 15:25
  • 5
    Я пробовал это: <xsl:for-each select="substring(name(.), string-length(name(.)) - 1) = 'grp'"> Я получаю сообщение об ошибке: `XPTY0020: требуемый тип элемента контекста для дочерней оси - node (); заданное значение имеет тип элемента xs: boolean` – Si8 28 October 2015 в 15:00

С XPath 1.0 вы можете использовать шаблон /data/stats/*[substring-after(name(), '_cost') = '']. Это проверяет, заканчивается ли имя элемента суффиксом _cost. В XPath 2.0 есть fn:ends-with(str, str), и ваш соответствующий вывод будет *[ends-with(name(), '_cost')].

5
ответ дан Alex Nikolaenkov 19 August 2018 в 16:26
поделиться
  • 1
    Спасибо за ваш ответ, содержит хорошо работает для меня, поскольку он проверял, существует ли строка. Кроме того, у моей среды нет XPath 2. Приветствия в любом случае :-) – Ben Everard 17 November 2010 в 11:40
  • 2
    как указывает @ILMV, это будет выбирать элемент без "_cost" от его имени. Проверьте мой ответ. – user 17 November 2010 в 13:35
  • 3
    @Alejandro, спасибо, что указал на мою ошибку. – Alex Nikolaenkov 17 November 2010 в 15:03
  • 4
    [substring-after (name (), '_cost') = ''] Это также верно для любого имени (), которое не содержит «_cost», -1 – FCR 29 July 2013 в 16:56

Вы также можете использовать contains

, например

/data/stats[contains(.,'_cost')] 
5
ответ дан redsquare 19 August 2018 в 16:26
поделиться
  • 1
    . обозначает весь текстовый контент, и это выражение будет соответствовать всем узлам stats, содержание которых содержит подстроку _const. Никаких гарантий относительно имен позиций и узлов. – Alex Nikolaenkov 17 November 2010 в 11:09
  • 2
    /data/stats/*[contains(local-name(),'_cost')] будет работать, хотя ... – annakata 17 November 2010 в 11:13
  • 3
    Я пошел с этим в конце [contains(local-name(),'_cost')], он не дискриминирует позицию, которая является позором, но в контексте ее использования это не имеет большого значения. – Ben Everard 17 November 2010 в 11:39
  • 4
    Это не верно. Это выбирает элемент stats, совпадающий с "_cost" в его строковом значении. Проверьте мой ответ. – user 17 November 2010 в 13:38
0
ответ дан David W. 31 October 2018 в 03:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: