XPath significa Lenguaje de Ruta XML. Se puede usar para navegar a través de elementos y atributos en un documento XML. Si eres nuevo en XPATH, por favor consulta el Tutorial de XPath primero y estudia la documentación oficial de XPATH.
Los chatbots de IA pueden ser muy efectivos para generar y verificar XPath.
Se admite un subconjunto de XPath 1.0 con las siguientes limitaciones:
-
Eje en paso
-
Compatibilidad
ancestro, ancestro-o-propio, atributo, hijo, descendiente, descendiente-o-propio
-
Sin compatibilidad
siguiente, anterior, hermano-siguiente, hermano-anterior, espacio de nombres
-
-
Predicado
-
Compatibilidad
condiciones en el nodo actual o nodos ancestros y sus propiedades (atributos, espacios de nombres)
-
Sin compatibilidad (por ejemplo)
número de posición, eje child::, descendiente, descendiente-o-propio, following::, preceding::, following-sibling::, preceding-sibling::, función last()
-
Reglas básicas
-
Usar
/y//en rutas -
Usar comillas simples
' 'en nombres -
Usar una barra
|para unir las solicitudes -
Los nombres son sensibles a mayúsculas y minúsculas:
<Body>es diferente de<body>
Ejemplos
Ejemplo de XPath 1 y Ejemplo de XPath 2 (con espacio de nombres) son archivos de ejemplo para lo siguiente:
-
Importar todos los elementos y todos los atributos
//* | //@* -
Importar todos los elementos y el valor del atributo1
(<elem1 attribute1="traducir" attribute2="No traducir"/>)//* | //@attribute1 -
Importar todos los descendientes de los elementos Child
//Child//* -
Importar un elemento lis y sus descendientes solo si el atributo translate='true'
(<lis translate="true">traduce esto</lis><lis translate="false">no traduzcas esto</lis>)//lis[@translate='true']/descendant-or-self::* -
Importar todos los elementos y descendientes si el atributo del elemento es translate='true'
//*[@translate='true']/descendant-or-self::* -
Importar el valor del atributo Text en el elemento Data
<Data Text="Texto para traducción">//data/@text -
Importar el
<mT:translation>elemento y sus descendientes, excepto el elemento<mT:ignore>//mT:translation/descendant-or-self::*[not(ancestor-or-self::mT:ignore)] -
Excluir todos los elementos con el atributo translate='false'
//*[not(@translate='false')] -
Excluir elementos 'lis' con el atributo translate='false'
(<lis translate="false">No traducir)//*[not(self::lis[@translate='false'])] -
Excluir elementos 'lis' con el atributo translate='false' y sus descendientes
(<lis translate="false"><p>No traducir)//*[not(ancestor-or-self::lis[@translate='false'])] -
Excluir todos los elementos que contengan 'link'
(<menu1link><tmenu41link>)//*[not(contains(name(),'link'))] -
Excluir todos los elementos si ellos o su ancestro tienen un atributo 'lis' que contenga 'link'
(<ele lis=menu1link>, <mon lis=tmenu41link>)//*[not(ancestor-or-self::node()[contains(@lis, 'link')])] -
Importar elementos PT si su padre LANG tiene el atributo 'updated' con el año 2015
(<LANG updated="20150213T121526"><PT>'//LANG[contains(@updated,'2015')]/PT -
Importar elementos 'Description' y 'Name' solo si no son descendientes de elementos 'Definitions' o 'Types'
://*[not(ancestor-or-self::*[(name()='Definitions') or (name()='Types')])]/*[(name()='Description') or (name()='Name')] -
XML con espacio de nombres
<root xmlns:xhtml="http://www.w3.org/1999/xhtml"><Child><Text>translate this</Text></Child>-
importar todos los elementos en
<Child>://*[local-name()='Child']//* -
importar solo elementos
<Texto>en<Hijo>://*[local-name()='Hijo']/*[local-name()='Texto'] -
importar todos los elementos bajo el elemento
<CONTRATO>, si el atributo<CATEGORÍA>en<CONTRATO>tiene el valor<ORIGINAL>://*[local-name()='CONTRATO' and @CATEGORÍA='ORIGINAL']//*
-
-
XML con espacio de nombres y atributos
<raíz>xmlns:xhtml="http://www.w3.org/1999/xhtml"<Hijo translate='1'>traduce esto</Hijo>-
importar elemento
<Hijo>si el atributo translate es 1://*[local-name()="Hijo"][@*[local-name()='translate']='1'] -
importar todos los elementos con el atributo translate=true:
//*[@*[local-name()='translate']='true']
-
-
XML con espacio de nombres. Importar el elemento objetivo del elemento
tu, pero no cuando el atributo id contiene 'img' o 'extra':-
Ejemplo de archivo:
<tu id="páginas|contenido|extra"><ori xml:lang="en">Curso uno</ori><target xml:lang="lang">Curso uno</target></tu> -
Ejemplo de XPATH:
//*[local-name()='tu' and not(contains(@id,'img') or contains(@id,'extra'))]/*[local-name()='target']
-
-
Importar todos los elementos excepto
<comentario>y<lis>a menos que<lis translate="true">y sus descendientes://*[count(ancestor-or-self::node()[(name()='lis' and (not(@translate='true')) ) or name()='comentario'])=0] -
Importar todos los elementos excepto
<comentario>y excepto elementos con atributo<... atributo2="No traducir">y sus descendientes://*[count(ancestor-or-self::node()[(@atributo2='No traducir') or name()='comentario'])=0] -
Importar valores de atributos
varNameyglossNamepero solo si sus ancestros tienen atributoatributo1='traducir'oatributo1='editar'://*[(self::node()[@atributo1='traducir' or @atributo1='editar'])]//@*[local-name()='varName' or local-name()='glossName'] -
Importar todos los elementos y atributos excepto elementos con el atributo
Nombre= Volver,Menú, oTiempo://*[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'])]En este caso, puede ser mejor importar todo y bloquear los atributos que no se requieren para la importación. Una vez que los segmentos están bloqueados, copia la fuente a la meta en el editor para tener el original transferido a la traducción.
-
Bloquear todos los elementos con el atributo
Namecon valores:Back,Menu, oTimey sus descendientes://*[@Name='Back' or @Name='Menu' or @Name='Time']/descendant-or-self::* -
Bloquear todos los atributos de
Namecon valores:Back,Menu, oTimey sus descendientes//*[@Name='Back' or @Name='Menu' or @Name='Time']//@*
-
Algunos ejemplos externos examples.
Nota de contexto
Las notas de contexto se pueden importar en segmentos traducidos.
Hay tres ejemplos en esta muestra:
<?xml version-"1.0" encoding="utf-8"?> <root> <element context1="Nota en el atributo de parentElement 1 - seleccionar ../@context1"> <field context2="Nota en el atributo 1 - seleccionar @context2" >para traducción1</field> <context3>Nota en el elemento 1 - seleccionar ../context3</context3> </element> <element context1="Nota en el atributo de parentElement 2"> <field context2="Nota en el atributo 2">para traducción2</field> <context3>Nota en el elemento 2</context3> </element> </root>
-
Atributo en el elemento raíz (contexto 1): ../@context1
-
Atributo en el elemento propio (contexto 2): @context2
-
Elemento hermano (contexto 3): ../context3
Si importando Elementos&Atributos: //* el contenido de la nota de contexto será importado a los segmentos de fuente también. Excluir los elementos/atributos de la nota de contexto de la importación general en Elementos&Atributos.