2011-12-15 22 views
5

estoy trabajando con lo siguiente (subóptima) XML:El uso de recuento XPath() con contiene()

<a> 
    <b> 
    <c>X:1 Y:0</c> 
    <c>X:1 Y:0</c> 
    <c>X:2 Y:0</c> 
    </b> 
    <b> 
    <c>X:1 Y:0</c> 
    <c>X:2 Y:0</c> 
    </b> 
</a> 

Estoy tratando de utilizar XPath para contar el número de <c> nodos cuyos contenidos contener X:1:

count(contains(/a/b/c, 'X:1')) 

Sin embargo, este devuelve un error en lugar de devolver el recuento esperado de 3.

¿Qué estoy haciendo mal?

+1

Este es uno de esos casos en los que estaría inclinado para sugerir el preprocesamiento de su XML con una hoja de estilos que expande estos elementos a '' etc., luego el procesamiento de datos como este se vuelve trivial. Si solo se trata de una tarea única, probablemente esto no valga la pena, pero si es algo que tendrá que hacer mucho, definitivamente vale la pena considerar la posibilidad de obtener los datos en una forma más útil primero. – Flynn1179

Respuesta

8

Esa no es la forma en que usa . Trate

count(/a/b/c[contains(., 'X:1')]) 
+0

¡Eso funcionó perfectamente, gracias! – gjb

+0

@gjb, @Phil Más como: "No es así como se usa' count() '" ya que el problema era que 'count()' toma un nodo configurado como parámetro pero 'contains()' devuelve un valor booleano . – jasso

+0

@jasso 'contains()' espera que el argumento uno sea una cadena, no un conjunto de nodos por lo que realmente hubo dos problemas – Phil

3

Probablemente un poco más eficiente (si la propiedad expuesta en el documento XML proporcionado no es casual):

count(/a/b/c[starts-with(., 'X:1')]) 
+0

se perdió un paréntesis de cierre – newtover

+0

@newtover: Buena captura, gracias. Corregido ahora. –

+0

+1 por su sugerencia, pero me temo que el orden a veces puede variar. – gjb

Cuestiones relacionadas