xml - regulares - Expresión de Xpath con múltiples predicados
xml find by xpath (4)
Estoy intentando construir una expresión compleja de xpath que responderá a la siguiente condición.
A partir de los datos XML a continuación, devuelve la entidad Usuario que:
- Su nombre de usuario es " usuario1 "
- Su nombre es " Usuario 1 "
Él tiene 2 valores de perfiles diferentes que son " operador " y " administrador " (no sé el orden exacto por delante)
<user> <login>user1</login> <name>User 1</name> <profile> <value>admin</value> <id>2</id> <description>admin users</description> </profile> <profile> <value>operator</value> <id>1</id> <description>Operator</description> </profile> </user> <user> <login>user2</login> <name>User 2</name> <profile> <value>admin</value> <id>4</id> <description>admins users</description> </profile> <profile> <value>poweruser</value> <id>5</id> <description>power users</description> </profile> </user> </root>
¿Puede alguien proporcionar un ejemplo para un caso así?
EDITAR: se agregó una entidad de perfil complejo
Asumiendo users
es la raíz:
/users/user[login=''user1'' and name=''User 1''
and (profile=''admin'' and profile=''operator'')]
Lo siguiente debe hacer lo que busca:
/root/user[login=''user1'' and
name=''User 1'' and
profile=''admin'' and
profile=''operator'']
Tener dos pruebas para el valor del profile
puede parecer extraño, pero como hay múltiples nodos de profile
, la condición se cumplirá siempre que al menos un nodo coincida con la prueba.
La razón por la que puede comparar un profile
directamente a una string
, aunque en realidad sea un node
es que el string-value
de string-value
de un nodo de elemento es el string-value
de string-value
de todos sus descendientes concatenadas, que en este caso son solo los contenidos de value
.
Si el profile
contiene más elementos que value
, debe usar una prueba de predicado un poco más compleja para determinar la existencia de un nodo de profile
coincidente basado solo en el value
(esto debería funcionar con su pregunta actualizada):
/root/user[login=''user1'' and
name=''User 1'' and
profile[value=''admin''] and
profile[value=''operator'']]
Aquí hay una respuesta más exacta (en este momento, la respuesta de Greg Beech no verifica la condición 3. en el problema: el elemento user
debe tener exactamente 2 hijos de profile
):
/*/user
[login=''user1''
and
name=''User 1''
and
not(profile[3])
and
profile/value=''admin''
and
profile/value=''operator''
]
/root/user[login=''user1'' and name=''User 1'' and profile/value=''admin'' and profile/value=''operator''