2012-01-25 22 views
10

tengo las siguientes rutas:¿Cuál es el equivalente XPath del operador Coalesce?

  • /mi: empresa/ns1: Auditoría/ns1: Visita/ns1: customField10
  • /mi: empresa/ns1: Auditoría/ns1: Visita/ns1: accountNumber

Deseo seleccionar ns1: customField10 si no está vacío; de lo contrario, deseo devolver ns1: accountNumber.

He intentado lo siguiente:

xml.SelectSingleNode(
    "(/my:cobius/ns1:Audit/ns1:Visit/ns1:customField10 | 
    /my:cobius/ns1:Audit/ns1:Visit/ns1:accountNumber)", ns) 

Pero siempre está volviendo accountNumber. Intenté cambiar el orden de customField10 y accountNumber, pero no me gustó. Todavía devuelve accountNumber.

¿Cómo puedo hacer el equivalente del operador de fusión en XPath?

Actualización:

Aquí está el código final:

xml.SelectSingleNode(
    "(/my:company/ns1:Audit/ns1:Visit/ns1:customField10[normalize-space()] | 
    /my:company/ns1:Audit/ns1:Visit/ns1:accountNumber[not(normalize-space(../ns1:customField10))])", ns) 
+0

'¿Por qué no xml.SelectSingleNode()' para ambos nodos y una normal de '' ... si después de eso? – Tomalak

+1

Puede ser más fácil responder a su pregunta si nos indicó cuál es el operador de fusión o, en cualquier caso, qué tecnología está pensando que tiene dicho operador. –

+0

@Tomalak Por la misma razón, usaría un operador de coalescencia en SQL o C#. ¿Por qué no hacerlo en línea en lugar de asignar dos variables y hacer un chequeo? –

Respuesta

5

Su código funcionaría si el nodo faltaba (especie de equivalente a un valor NULL en SQL). Pero no está vacío (como una cadena vacía en SQL).

Puede añadir, por supuesto, un predicado:

/my:cobius/ns1:Audit/ns1:Visit/ns1:customField10[string-length(.)] | /my:cobius/ns1:Audit/ns1:Visit/ns1:accountNumber 
+0

En realidad, más como '/ foo [string-length()] |/bar [not (/ foo [string-length()])] ' – Tomalak

+0

' | 'no es un tipo de cortocircuito lógico-o. Es un operador sindical. En otras palabras, si ambos existen, obtendrás ambos, que no es lo que quiere el OP. –

+0

@lwburk: No necesariamente, vea el comentario anterior. ;) – Tomalak

Cuestiones relacionadas