2010-11-17 72 views
35

Quiero tomar un nodo de mi archivo XML, el nodo tiene un prefijo como "latest_", pero esto puede cambiar y me gustaría que mi XSLT sea lo más fluido posible. Aquí está el XPath quiero usar:comodines de XPath en el nombre de nodo

/data/stats/*_cost 

Este debe coincidir con latest_cost, newest_cost, anything_cost, hay una manera de hacer esto?

Saludos :-)

+0

Depende de si XPath 2.0 está disponible en su entorno. XPath 1.0 no permite esto y 2.0 lo hace. – Younes

+0

En cuanto a expresiones como '* _cost', ni XPath 1.0 ni XPath 2.0 lo permiten. –

Respuesta

58

Ésta es la correcta expresión XPath 1.0 wich seleccionar un elemento con el pasado 5 carácter del nombre igual a "_cost" en cualquier espacio de nombres.

/data/stats/*[substring(name(), string-length(name()) - 4) = '_cost'] 
+0

De acuerdo, he introducido esto en mi aplicación y hace lo que necesito sin las otras desventajas, vea mi comentario a reqsquare. Gracias. –

+0

@ILMV: Usted es bienvenido. Me alegra que te ayude. –

+0

+1 y gracias a @ user357812: esto ha sido muy útil para mi caso de uso similar (sufijos de atributo coincidentes). Cómo hacer esto es [aquí] (http://blog.jondh.me.uk/2011/10/simplexml-selector-sector-de-tributo-no-having-suffix/) si alguien está interesado. – halfer

5

Con XPath 1.0 se puede utilizar /data/stats/*[substring-after(name(), '_cost') = ''] patrón. Eso verifica si el nombre del elemento termina con el sufijo _cost. En XPath 2.0 hay fn:ends-with(str, str) y su expersión correspondiente será *[ends-with(name(), '_cost')].

+0

Gracias por su respuesta, el contenido funcionó bien para mí ya que comprobó si la cadena también existe. Además, mi entorno no parece tener XPath 2. Cheers de todos modos :-) –

+2

como @ILMV señala, esto seleccionará un elemento sin "_cost" en su nombre. Verifica mi respuesta. –

+0

@Alejandro, gracias por señalar mi error. –

5

También es posible usar contains

por ejemplo

/data/stats[contains(.,'_cost')] 
+0

'.' representa todo el contenido de texto y esto expresión coincidirá con todos los nodos 'stats' cuyo contenido de texto contiene la subcadena' _const'. Sin garantías sobre la posición y los nombres de nodo. –

+1

'/ data/stats/* [contains (local-name(), '_ cost')]' funcionaría ... – annakata

+0

Fui con esto al final '[contains (local-name(), '_ cost')] ', no discrimina contra la posición, lo cual es una pena, pero en el contexto de su uso eso realmente no importa. –

Cuestiones relacionadas