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