XPath significa idioma XML Path. Se puede utilizar para navegar a través de elementos y atributos en un documento XML. Si eres nuevo en XPATH, consulta primero el Tutorial XPath y estudia la documentación XPATH oficial.
Los chatbots IA pueden ser muy efectivos para generar y verificar Xpath.
Un subconjunto de XPath 1.0 es compatible con las siguientes limitaciones:
-
Eje al paso
-
Compatible
antepasado, antepasado-o-mismo, atributo, elemento secundario, descendiente, descendiente-o-mismo
-
No soportado
espacio de nombres siguiente, precedente, siguiente, precedente-hermana
-
-
Predicado
-
Compatible
condiciones en los nodos actuales o nodos antecesores y sus propiedades (atributos, espacios de nombres)
-
No compatible (por ejemplo)
número de posición, elemento secundario del eje::, descendiente, descendiente-o-mismo, siguiente::, precedente::, siguiente-hermano::, precedente-hermano::, función last()
-
Reglas básicas
-
Usar
/
y/ /
en rutas -
Usar comillas simples
' '
en los nombres -
Usar una tubería
|
para unir las solicitudes -
Los nombres son sensibles a las mayúsculas y minúsculas:
<Body>
es diferente de<body>
Ejemplos
XPath Ejemplo 1 y XPath Ejemplo 2 (con espacio de nombres) son archivos de ejemplo para los siguientes:
-
Importar todos los elementos y todos los atributos
//* | //@*
-
Importar todos los elementos y el valor del atributo1
(<elem1 attribute1="translate" attribute2="Do not translate"/>)
//* | //@attribute1
-
Importar todos los descendientes de elementos secundarios
//Child//*
-
Importar un elemento lis y sus descendientes sólo si el atributo translate='true'
(<lis translate="true">traducir esto</lis><lis translate="false">no traducir esto</lis>)
//lis[@translate='true']/descendant-or-self::*
-
Importar todos los elementos y descendientes si el atributo del elemento es traducir='true'
//*[@translate='true']/descendant-or-self::*
-
Importar valor del atributo Texto en el elemento Datos
<Data Text="Texto para traducción">
//data/@text
-
Importar el elemento
<MT:traducción>
y sus descendientes, excepto el elemento<MT:ignorar>
//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 'enlace'
(<menu1link><tmenu41link>)
//*[not(contains(name(),'link'))]
-
Excluir todos los elementos si ellos o su antepasado tienen un atributo 'lis' que contenga 'enlace'
(<ele lis=menu1link>, <mon lis=tmenu41link>)
//*[not(ancestor-or-self::node()[contains(@lis, 'link')])]
-
Importar elementos PT si su LANG elemento raíz tiene el atributo 'actualizado' con el año 2015
(<LANG actualizado="20150213T121526"><PT>'
//LANG[contains(@updated,'2015')]/PT
-
Importar elementos 'Descripción' y 'Nombre' sólo si no son descendientes de elementos 'Definiciones' o 'Tipos'
://*[not(ancestro-o-mismo::*[(nombre()='Definiciones') o (nombre()='Tipos')])]/*
[(name()='Descripción') o (name()='Nombre')]
-
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
<elementos secundarios>
://*[local-name()='Child']//*
-
importar sólo elementos
<Texto>
en<elementos secundarios>
://*[local-name()='Child']/*[local-name()='Text']
-
importar todos los elementos bajo el elemento
<CONTRACT>
, si el atributo<CATEGORY>
en<CONTRACT>
tiene el valor<ORIGINAL>
:/ /* [local-name()='CONTRACT' y @CATEGORY='ORIGINAL']/ /*
-
-
XML con espacio de nombres y atributos
<root>
xmlns:xhtml="http://www.w3.org/1999/xhtml"<elemento secundario traducir='1'>traducir este</elemento secundario>
-
importar elemento
<elemento secundario>
si la traducción del atributo es 1:/ / *[local-name()="elemento secundario"][@*[local-name()='traducir']='1']
-
importar todos los elementos con el atributo translate=true:
// *[@*[local-name()='translate']='true']
-
-
XML con espacio de nombres. Importar el elemento meta del elemento
tu
, pero no cuando la ID del atributo contiene 'img' o 'extra':-
Ejemplo de archivo:
<tu ID="pages|contenido|extra"><ori xml:lang="en">Curso uno</ori><meta xml:lang="lang">Curso uno</meta></tu>
-
Ejemplo XPATH:
/ /* [local-name()='tu' y not(contains(@id,'img') o contain(@id,'extra'))]/*[local-name()='meta']
-
-
Importar todos los elementos excepto
<comentario>
y<lis>
a menos que<lis translate="true">
y sus descendientes:/ /* [count(ancestro-o-mismo::nodo()[(nombre()='lis' y (not(@traducir='verdadero')) ) o nombre()='comentario'])=0]
-
Importar todos los elementos excepto
<comentario>
y excepto los elementos con atributo<... atributo2="No traducir">
y sus descendientes://*[count(ancestor-or-self::node()[(@attribute2='Do not translate') or name()='comment'])=0]
-
Importar valores de atributos
varName
yglossName
, pero solo si sus ancestros tienen atributoatributo1='traducir'
oatributo1='editar'
:/ /*[(self::node()[@attribute1='translate' o @attribute1='editar'])]//@*[local-name()='varName' o local-name()='glossName']
-
Importar todos los elementos y atributos, excepto los elementos cuya propiedad sea
Nombre= Volver
,Menú
oHora
:/ /* [not(ancestro-o-mismo::nodo()[@Nombre='Volver' o @Nombre='Menú' o @Nombre='Hora'])] | //@*[not(ancestro-o-mismo::nodo()[@Nombre='Volver' o @Nombre='Menú' o @Nombre='Hora'])]
En este caso, puede ser mejor importar todos y bloquear los atributos no necesarios para importar. Una vez bloqueados los segmentos, copie fuente a meta en el editor con orden de transferir el original a traducción.
-
Bloquear todos los elementos con el
Nombre
de atributo con valores:Volver
,Menú
oTiempo
y sus descendientes:/ /* [@Nombre='Volver' o @Nombre='Menú' o @Nombre='Hora']/descendiente-o-mismo::*
-
Bloquear todos los atributos de
Nombre
con valores:Volver
,menú
otiempo
y sus descendientes/ /* [@Nombre='Volver' o @Nombre='Menú' o @Nombre='Hora']/ /@*
-
Algunos ejemplos externos.
Nota de contexto
Las notas de contexto se pueden importar a segmentos traducidos.
Hay tres ejemplos en esta muestra:
<?xml version-"1.0" encoding="utf-8"?> <root> <contexto del elemento1="Nota en la propiedad del elemento raíz 1 - seleccionar ../@contexto1"> <field context2="Nota en el atributo 1 – selecciona @context2" >para traducción1</field> <context3>Nota en el elemento 1 – seleccione ../context3</context3> </element> <contexto del elemento1="Nota en la propiedad del elemento raíz2"> <field context2="Nota en el atributo 2">para translation2</field> <context3>Nota en el elemento 2</context3> </element> </root>
-
Atributo en elemento raíz (contexto 1): ../@contexto1
-
Atributo en elemento propio (contexto2): @contexto2
-
Elemento hermano (contexto 3): ../contexto3
Si se importan Elementos y atributos: / /*
el contenido de la nota de contexto también se importará a los segmentos fuente. Excluir los elementos/atributos de la nota de contexto de importarlos en general en Elementos&Atributos.