2014-09-18 11 views
3

Учитывая следующую структуру документа, как я могу проверить, соответствуют ли два значения атрибута с помощью Xpath?Сравнение значений атрибутов с помощью Xpath

<document lang="en"> 
<element lang="en"></element> 
<element lang="sv"></element> 
<element lang="fr"></element> 
</document> 

Что я ищу что-то вроде:

//document[@lang="[//element[@lang]"] 
+1

Есть ли причина, по которой вы должны использовать xpath, а не что-то еще? – Kytuzian

+0

Да. Ограничения редактора. – user2075124

ответ

4

Это будет возвращать все <document> узлы, имеющие lang значение атрибута соответствует любой дочерний узел <element>lang:

//document[@lang = element/@lang] 
0

Этот пример должен работать:

//document/@lang[. = //element/@lang] 
0

XPath - это язык запросов. Его основное использование - найти Узлы XML, а не «проверку», если такое-то условие истинно или нет.

Задача, подобная этой, лучше подходит для языка хоста XPath встроена, например, в XSLT. В XSLT для этого есть элемент xsl:if.

Например, написать шаблон как

<xsl:template match="/document"> 
    <xsl:if test="@lang = element/@lang"> 
    <true/> 
    </xsl:if> 
</xsl:template> 

Шаблон выше соответствует document и возвращает <true/> элемент, если значение атрибута из element элемента такой же, как значение document/@lang.

+0

Спасибо за ваш ответ, но, к сожалению, я не могу использовать XSL/XSLT в этой ситуации. – user2075124

1

Специально для вашего примера, вы можете использовать:

//document[@lang=child::element/@lang] 

Если вы просто проверить, существует ли совпадение, вы можете обернуть его в boolean:

boolean(//document[@lang=child::element/@lang]) 

Если вы хотите выбрать согласованный элемент, вы можете проверить по ancestor:

//element[@lang=ancestor::document[1]/@lang] 

Если вы хотите, чтобы соответствовать любым узлам, которые имеют соответствующие атрибуты в другом месте, вы можете сделать что-то вроде этого:

//node()[@lang=following::node()/@lang] 

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

Смежные вопросы