XPath significa Linguagem de Caminho XML. Pode ser usado para navegar através de elementos e atributos em um documento XML. Se você é novo no XPATH, por favor veja o Tutorial de XPath primeiro e estude a documentação oficial do XPATH.
Chatbots de IA podem ser muito eficazes na geração e verificação de Xpath.
Um subconjunto do XPath 1.0 é suportado com as seguintes limitações:
-
Eixo na etapa
-
Aceita
ancestral, ancestral-ou-próprio, atributo, secundário, descendente, descendente-ou-próprio
-
Não compatível
seguinte, anterior, irmão-seguinte, irmão-anterior, namespace
-
-
Predicado
-
Aceita
condições no nó atual ou nos nós ancestrais e suas propriedades (atributos, namespaces)
-
Não compatível (por exemplo)
número da posição, eixo child::, descendente, descendente-ou-próprio, seguinte::, anterior::, irmão-seguinte::, irmão-anterior::, função last()
-
Regras básicas
-
Use
/e//em caminhos -
Use aspas simples
' 'em nomes -
Use um pipe
|para juntar os pedidos -
Nomes são sensíveis a maiúsculas e minúsculas:
<Body>é diferente de<body>
Exemplos
Exemplo de XPath 1 e exemplo de XPath 2 (com namespace) são arquivos de exemplo para o seguinte:
-
Importar todos os elementos e todos os atributos
//* | //@* -
Importar todos os elementos e o valor do atributo1
(<elem1 attribute1="translate" attribute2="Do not translate"/>)//* | //@attribute1 -
Importar todos os descendentes dos elementos Child
//Child//* -
Importar um elemento lis e seus descendentes apenas se o atributo translate='true'
(<lis translate="true">translate this</lis><lis translate="false">do not translate this</lis>)//lis[@translate='true']/descendant-or-self::* -
Importar todos os elementos e descendentes se o atributo do elemento for translate='true'
//*[@translate='true']/descendant-or-self::* -
Importar o valor do atributo Text no elemento Data
<Data Text="Text for translation">//data/@text -
Importar o
<mT:translation>elemento e seus descendentes, exceto o elemento<mT:ignore>//mT:translation/descendant-or-self::*[not(ancestor-or-self::mT:ignore)] -
Excluir todos os elementos com o atributo translate='false'
//*[not(@translate='false')] -
Excluir elementos 'lis' com o atributo translate='false'
(<lis translate="false">Do not translate)//*[not(self::lis[@translate='false'])] -
Excluir elementos 'lis' com o atributo translate='false' e seus descendentes
(<lis translate="false"><p>Do not translate)//*[not(ancestor-or-self::lis[@translate='false'])] -
Excluir todos os elementos que contêm 'link'
(<menu1link><tmenu41link>)//*[not(contains(name(),'link'))] -
Excluir todos os elementos se eles ou seus ancestrais tiverem um atributo 'lis' contendo 'link'
(<ele lis=menu1link>, <mon lis=tmenu41link>)//*[not(ancestor-or-self::node()[contains(@lis, 'link')])] -
Importar elementos PT se seu pai LANG tiver o atributo 'updated' com o ano 2015
(<LANG updated="20150213T121526"><PT>'//LANG[contains(@updated,'2015')]/PT -
Importar elementos 'Descrição' e 'Nome' apenas se não forem descendentes de elementos 'Definições' ou 'Tipos'
://*[not(ancestor-or-self::*[(name()='Definitions') or (name()='Types')])]/*[(name()='Description') or (name()='Name')] -
XML com namespace
<root xmlns:xhtml="http://www.w3.org/1999/xhtml"><Child><Text>traduzir isso</Text></Child>-
importar todos os elementos em
<Child>://*[local-name()='Child']//* -
importar apenas elementos
<Text>em<Child>://*[local-name()='Child']/*[local-name()='Text'] -
importar todos os elementos sob o elemento
<CONTRACT>, se o atributo<CATEGORY>em<CONTRACT>tiver o valor<ORIGINAL>://*[local-name()='CONTRACT' and @CATEGORY='ORIGINAL']//*
-
-
XML com namespace e atributos
<root>xmlns:xhtml="http://www.w3.org/1999/xhtml"<Child translate='1'>traduzir isso</Child>-
importar elemento
<Child>se o atributo traduzir for 1://*[local-name()="Child"][@*[local-name()='translate']='1'] -
importar todos os elementos com o atributo translate=true:
//*[@*[local-name()='translate']='true']
-
-
XML com namespace. Importar o elemento target do elemento
tu, mas não quando o atributo id contém 'img' ou 'extra':-
Exemplo de arquivo:
<tu id="pages|content|extra"><ori xml:lang="en">Curso um</ori><target xml:lang="lang">Curso um</target></tu> -
Exemplo de XPATH:
//*[local-name()='tu' and not(contains(@id,'img') or contains(@id,'extra'))]/*[local-name()='target']
-
-
Importar todos os elementos, exceto
<comment>e<lis>a menos que<lis translate="true">e seus descendentes://*[count(ancestor-or-self::node()[(name()='lis' and (not(@translate='true')) ) or name()='comment'])=0] -
Importar todos os elementos, exceto
<comment>e exceto elementos com atributo<... attribute2="Não traduzir">e seus descendentes://*[count(ancestor-or-self::node()[(@attribute2='Não traduzir') or name()='comment'])=0] -
Importar valores dos atributos
varNameeglossNamemas somente se seus ancestrais tiverem atributoattribute1='translate'ouattribute1='edit'://*[(self::node()[@attribute1='translate' or @attribute1='edit'])]//@*[local-name()='varName' or local-name()='glossName'] -
Importar todos os elementos e atributos, exceto elementos com o atributo
Name= Back,Menu, ouTime://*[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'])]Neste caso, pode ser melhor importar tudo e bloquear os atributos não necessários para importação. Uma vez que os segmentos estão Bloqueados, copie a fonte para o alvo no editor para ter o original transferido para a tradução.
-
Bloquear todos os elementos com o atributo
Namecom valores:Back,Menu, ouTimee seus descendentes://*[@Name='Voltar' ou @Name='Menu' ou @Name='Hora']/descendant-or-self::* -
Bloquear todos os atributos de
Namecom valores:Voltar,Menu, ouHorae seus descendentes//*[@Name='Voltar' ou @Name='Menu' ou @Name='Hora']//@*
-
Alguns exemplos externos.
Nota de contexto
Notas de contexto podem ser importadas para segmentos traduzidos.
Existem três exemplos neste exemplo:
<?xml version-"1.0" encoding="utf-8"?> <root> <element context1="Nota no atributo de parentElement 1 - selecionar ../@context1"> <field context2="Nota no atributo 1 - selecionar @context2" >para tradução1</field> <context3>Nota no elemento 1 - selecionar ../context3</context3> </element> <element context1="Nota no atributo de parentElement 2"> <field context2="Nota no atributo 2">para tradução2</field> <context3>Nota no elemento 2</context3> </element> </root>
-
Atributo no elemento pai (contexto 1): ../@context1
-
Atributo no elemento próprio (contexto2): @context2
-
Elemento irmão (contexto 3): ../context3
Se importando Elementos&Attributes: //* o conteúdo da nota de contexto será importado para os segmentos de origem também. Excluir os elementos/atributos da nota de contexto da importação geral em Elementos& Atributos.