XPath - язык пути XML. С его помощью можно перемещаться по элементам и атрибутам в документе XML. Если вы новичок в XPATH, сначала просмотрите XPath Tutorial и изучите официальную документацию XPATH.
Чат-боты искусственного интеллекта (ИИ) могут быть очень эффективными в генерации и проверке Xpath.
Подмножество XPath 1.0 поддерживается со следующими ограничениями:
-
Ось на этапе
-
Поддерживаются
предок, предок-или-я, атрибут, дочерний элемент, потомок, потомок-или-я
-
Не поддерживается
следующее, предшествующее, следующее за другим, предшествующее, пространство имен
-
-
Основной
-
Поддерживаются
условия для текущих узлов или предков и их свойства (атрибуты, пространства имен)
-
Не поддерживается (например)
номер позиции, дочерний элемент оси::, потомок, потомок-или-я, следующий::, предшествующий::, следующий-родственный::, предшествующий-родственный:::, функция последний()
-
Основные правила
-
Использовать
/
и//
в путях -
Использовать одинарные кавычки
''
в именах -
Используйте трубу
|
для объединения запросов -
Имена зависят от регистра:
<тело>
отличается от<тела>
Примеры
Пример XPath 1 и пример XPath 2 (с пространством имен) являются примерами файлов для следующих файлов:
-
Импортировать все элементы и все атрибуты
//* | //@*
-
Импортировать все элементы и значение атрибута1
(<elem1 attribute1="translate" at2="Не переводить"/>)
//* | //@attribute1
-
Импортировать всех потомков дочерних элементов
//Ребенок//*
-
Импортировать элемент lis и его потомков, только если атрибут translation='true'
(<lis translation="true">translate this</lis><lis translation="false">не переводите this</lis>)
//lis[@translate='true']/descendant-or-self::*
-
Импортировать все элементы и потомков, если атрибут элемента — translation='true'
//*[@translate='true']/descendant-or-self::*
-
Импортировать значение атрибута Текст в элементе Данные
<Текст данных="Текст для перевода">
//data/@text
-
Импортировать элемент машинного перевода (
<<МТ):перевод>
и его потомков, за исключением элемента<<машинного перевода (мТ): пропустить>
//машинный перевод (МТ):перевод/потомок-или-себя::*[не(предок-или-себя::машинный перевод (МТ):пропустить)]
-
Исключить все элементы с атрибутом translation='false'
//*[not(@translate='false')]
-
Исключить элементы 'lis' с атрибутом translation='false'
(<lis translation="false">Не переводить)
//*[not(self::lis[@translate='false'])]
-
Исключить элементы 'lis' с атрибутом translation='false' и их потомков
(<lis translation="false"><p>Не переводить)
//*[not(ancestor-or-self::lis[@translate='false'])]
-
Исключить все элементы, содержащие «ссылку»
(<menu1link><tmenu41link>)
//*[not(contains(name(),'link'))]
-
Исключите все элементы, если у них или их предка есть атрибут 'lis', содержащий 'ссылку'
(<ele lis=menu1link>, <mon lis=tmenu41link>)
//*[not(ancestor-or-self::node()[содержит(@lis, 'link')])]
-
Импортировать элементы PT, если их родительский элемент LANG имеет атрибут «обновлен» с 2015 годом
(<LANG обновлен="20150213T121526"><PT>'
//LANG[содержит(@updated,'2015')]/PT
-
Импортировать элементы «Описание» и «Имя» только в том случае, если они не являются потомками элементов «Определения» или «Типы»
http://*[not(ancestor-or-self::*[(name()='Definitions') или (name()='Types')]]/*
[(имя()='Описание') или (имя()='Имя')]
-
XML с пространством имен
<root xmlns:xhtml="http://www.w3.org/1999/xhtml"><Дочерний элемент><Text>перевести этот</Text></Дочерний элемент>
-
импортировать все элементы в
<Дочерних элементах>
://*[ local-name()='Дочерний элемент']//*
-
импортировать только элементы
<Текст>
в<Дочерних элементах>
://*[local-name()='Child']/*[local-name()='Text']
-
импортировать все элементы в рамках элемента
<CONTRACT>
, если атрибут<КАТЕГОРИЯ>
в<CONTRACT>
имеет значение<ORIGINAL>
http://*[local-name()='CONTRACT' и @CATEGORY='ORIGINAL']//*
-
-
XML с пространством имен и атрибутами
<root>
xmlns:xhtml="http://www.w3.org/1999/xhtml"<Дочерний элемент перевода='1'>перевести этот</Дочерний элемент>
-
импортировать
<Дочерний элемент>
, если перевод атрибута равен 1://*[local-name()="Дочерний элемент"][@*[local-name()='translate']='1']
-
импортировать все элементы с атрибутом translation=true:
///*[@*[local-name()='translate']='true']
-
-
XML с пространством имен. Импортировать перевод из элемента
tu
, но не тогда, когда Идентификатор атрибута содержит «img» или «extra»:-
Пример файла:
<tu Идентификатор="страницы|контент|extra"><ori xml:lang="en">Курс один</i><перевод xml:lang="lang">Курс один</перевод></tu>
-
Пример XPATH:
//*[local-name()='tu', а не(содержит(@id,'img') или содержит(@id,'extra'))]/*[local-name()='перевод']
-
-
Импортировать все элементы, кроме
<комментировать>
и<lis>
, если только<lis translate="true">
и их потомки://*[count(ancestor-or-self::node()[(name()='lis' и (not(@translate='true'))) или name()='comment'])=0]
-
Импортировать все элементы, кроме
<комментировать>
и за исключением элементов с атрибутом<... attribute2="Не переводить">
, и их потомков://*[count(ancestor-or-self::node()[(@attribute2='Не переводить')) или name()='comment'])=0]
-
Импортировать значения атрибутов
varName
иglossName
, но только если их предки имеют атрибутattribute1='translate'
илиattribute1='edit'
://*[(сам::node()[@attribute1='translate' или @attribute1='edit'])]//@*[local-name()='varName' или local-name()='glossName']
-
Импортировать все элементы и атрибуты, кроме элементов с атрибутом
Name= Back
,Menu
илиTime
://*[not(ancestor-or-self::node()[@Name='Back' или @Name='Menu' или @Name='Time'])] | //@*[not(ancestor-or-self::node()[@Name='Back' или @Name='Menu' или @Name='Time'])]
В этом случае, возможно, лучше импортировать все атрибуты и заблокировать атрибуты, которые не требуется импортировать. Заблокированные сегменты скопируйте оригинал в перевод в редакторе для заказа перевода оригинала.
-
Заблокировать все элементы с
Именем
атрибута со значениями:Назад
, вМеню
или воВремя
и их потомки://*[@Name='Back' или @Name='Menu' или @Name='Time']/descendant-or-self::*
-
Блокировать все атрибуты
Имени
со значениями:Назад
, вМеню
или воВремя
и их потомки//*[@Name='Back' или @Name='Menu' или @Name='Time']/@*
-
Некоторые внешние примеры.
Контекстное примечание
Контекстные примечания можно импортировать в переведенные сегменты.
В этом образце три примера:
<?xml версия-"1.0" кодировка="utf-8"?> <root> <element context1="Примечание в атрибуте родительскогоЭлемента 1 - выберите ../@context1"> <field context2="Отметьте в атрибуте 1 - выберите @context2" >для перевода1</field> <context3>Примечание в элементе 1 - выберите ../context3</context3> </element> <element context1="Примечание в атрибуте родительскогоЭлемента 2"> <field context2="Примечание в атрибуте 2">для перевода2</поле> <context3>Примечание в элементе 2</context3> </element> </root>
-
Атрибут в родительском элементе (контекст 1): ../@context1
-
Атрибут в элементе self (context2): @context2
-
Братский элемент (контекст 3): ../context3
При импорте элементов и атрибутов: //*
контент контекстного примечания также будет импортирован в сегменты исходника. исключить элементы/атрибуты контекстное примечание из общего импортировать в элементах и атрибутах.