2012-02-24 4 views

Respuesta

6

Utilice processing-instruction() node-test.

+1

Kirill, esta respuesta es demasiado general - no va a proporcionar una expresión XPath específica que selecciona exactamente el PI deseado. –

5

En general, se puede seleccionar una instrucción de procesamiento usando la prueba de nodo processing-instruction().

Más específicamente, uno puede incluir como argumento el nombre (objetivo) del nodo PI deseado.

Uso:

/processing-instruction('xml-stylesheet') 

Esto selecciona cualquier instrucción de procesamiento con el nombre xsl-stylesheet que se define en el nivel global (es hermano del elemento superior).

Tenga en cuenta que xsl:stylesheet es un objetivo PI no válido para un PI. Se utiliza un punto ':' para delimitar un prefijo de espacio de nombres del nombre local; sin embargo, una instrucción de procesamiento objetivo no puede pertenecer a un espacio de nombre. De acuerdo con la W3c XPath Specification:

"Una instrucción de procesamiento tiene un nombre expandido: la parte local es el objetivo de la instrucción de procesamiento, el URI de espacio es nulo."

También de acuerdo con el documento del W3C: "Associating Style Sheets with XML documents 1.0", el objetivo de la PI que asocia una hoja de estilo a un documento XML debe ser:. "xml-stylesheet" - no "xsl:stylesheet" o "xsl-stylesheet"

Aquí es un ejemplo completo:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 

<xsl:template match="/"> 
    <xsl:copy-of select="/processing-instruction('xml-stylesheet')"/> 
</xsl:template> 
</xsl:stylesheet> 

Cuando se aplica esta transformación con los del siguiente documento XML:

<?xml-stylesheet type="text/xsl" href="test"?> 
<Books> 
    <Book name="MyBook" /> 
</Books> 

la expresión XPath se evalúa y el nodo de PI seleccionada se emite:

<?xml-stylesheet type="text/xsl" href="test"?> 
+11

veo que todavía estás hasta sus viejos trucos ... Eliminar y volver a publicar una respuesta a desprenderse de bajada votos es el abuso hacia arriba: cómo la gente decide evaluar las respuestas es su decisión, no la tuya. Por favor, absténgase de hacer esto de nuevo. – Shog9

+0

¿'/ processing-instruction ('xml-stylesheet')' selecciona cosas con el nombre 'xsl-stylesheet'? Eso sería mágico! Tenga en cuenta 'xml' vs' xsl'. –

+0

@MicheldeRuiter, sí, lo hace. Esto se define formalmente aquí (el tercer párrafo de la parte inferior): http://www.w3.org/TR/xpath/#node-tests –

0

Un sombrero de instrucción de procesamiento se dirigen dos partes y datos con la sintaxis:

<?target data?> 

Si usa:

<xsl:value-of select="/processing-instruction('xml-stylesheet')" /> 

sólo devolverá la parte de datos, en el ejemplo de Dimitre Novatchev, devuelve:

type="text/xsl" href="test" 

lo tanto, el valor de cadena de una instrucción de procesamiento es la parte de datos. Se evalúa la expresión de selección de <xsl:value-of y el objeto resultante se convierte en una cadena, como una llamada implícita a la función string().

Cuestiones relacionadas