2009-08-28 14 views
6

¿Puedo enviar un nodo a una función XSLT? Por ejemplo:¿Cómo puedo enviar un nodo (cualquiera) a una función xsl:?

<books> 
    <book> 
    <author>a1</author> 
    <price>10</price> 
    <year>2009</year> 
    </book> 
    <!-- ... --> 
</books> 

¿Puedo enviar el elemento <book> a una función - dentro de esa función Quiero procesar los linfáticos de libro (<author>, <price> o <year>)

¿Puedo crear un XSL: función que abajo?

<xsl:function name="util:checkNode" as="xs:boolean"> 
     <!-- I would like to know xml schema data type for the param --> 
     <xsl:param name="nodeP" as="****"/> 
    </xsl:function 


      If yes, what xsl schema type to the param ? 

Parece que he creado mucha confusión a cada uno según su función en lugar de XSL diciendo: Función ---- :(

+0

¿Está pidiendo a las personas que escriban un código real para usted? Esto no funcionará muy bien, me temo ... – Tomalak

+0

Dada la redacción de la pregunta ("función", etc.) y deseo simplemente procesar el nodo, creo que @unknown es bastante nuevo para xslt. Y algunos ejemplos de código que usan libros/libros pueden ayudar, particularmente para otros xslt novatos a encontrar esta pregunta en una búsqueda. –

+0

Estoy buscando una función XSLT, que acepta un nodo (básicamente cualquier nodo) como parámetro de la función XSLT. Si es así, ¿puedo tener la sintaxis para la función XSLT? –

Respuesta

8

Creo que la respuesta a su pregunta es, sí. Usted puede enviar un nodo a una función XSLT.

Si se está preguntando qué usar para el valor del atributo as = "", tiene varias opciones. Si quiere ser muy laxo y aceptar casi cualquier cosa, use como = "item() *".

From David Pawson's site:

artículo() * .. especie de nodeset? W3C

Sí, estoy de acuerdo, parece bonita sin sentido, ¿no? Sin embargo. A partir de CR, es bastante esencial, especialmente si desea utilizar tipos. Y quiero generar, digamos, una secuencia nodeset .. sorry , en una variable.

<xsl:variable name="a" 
select="(//h3)[position() < 3]" 
as="item()*"/> 

Esto crea una variable que puede piratear en el uso de XPath con bastante facilidad. Es decir. recordar artículo() *.

tipos ... algunos ejemplos. W3C

De un correo electrónico explicativo de Mike Kay, gracias Mike. Ejemplos:

<xsl:param name="x" as="item()"/>

el valor del parámetro puede ser cualquier artículo (es decir, un nodo o valor atómico). Pero debe ser un solo elemento.

<xsl:param name="x" as="item()?"/>

el parámetro puede ser un solo elemento o una secuencia vacía

<xsl:param name="x" as="item()+"/>

el parámetro debe ser una secuencia de uno o más elementos - una secuencia vacía no está permitido

<xsl:param name="x" as="item()*"/>

el parámetro puede ser cualquier secuencia de cero o más elementos; esto no establece restricciones en su valor.

<xsl:param name="x" as="node()*"/>

El parámetro puede ser cualquier secuencia de cero o más nodos

<xsl:param name="x" as="xs:atomicValue*"/>

el parámetro puede ser cualquier secuencia de cero o más valores atómicos (por ejemplo números enteros, cadenas, o booleanos).

elemento() * es el tipo más general posible, coincide con todo, como "Objeto" en Java. Por esa razón, generalmente se puede omitir . Pero no siempre, por ejemplo, el tipo predeterminado en xsl: variable no es tema() *, pero documento-node(), para asegurar que

<xsl:variable name="rtf"><a>thing</a> </xsl:variable>

continúa comportándose como XSLT 1.0

Utilícelos para especificar parámetros, tipos de variables , etc.

0

XSL no le importa lo que el parámetro es Realmente trata todo como. XML. Si el texto se hace pasar en ella se trata como un nodo de texto.

Aquí se muestra un ejemplo con un enlace para mayor referencia.

http://www.w3schools.com/xsl/

<xsl:call-template name="TemplateName"> 
    <xsl:with-param name="ParamName" select="MyNode/MyNode" /> 
</xsl:call-template> 

<xsl:template name="TemplateName"> 
    <xsl:param name="ParamName" /> 
</xsl:template> 
+0

Estoy buscando una función XSLT, que acepta un nodo (básicamente, cualquier nodo que pueda ser) como un param a la función XSLT? Si es así, ¿puedo tener la sintaxis para la función XSLT? –

+0

Lo estás viendo. – ChaosPandion

-1

Para añadir a la respuesta ChaosPandion puede que tenga que añadir un node test a su consulta XPath:

<xsl:call-template name="TemplateName"> 
    <xsl:with-param name="ParamName" select="MyNode/MyNode/node()" /> 
</xsl:call-template> 

<xsl:template name="TemplateName"> 
    <xsl:param name="ParamName" /> 
</xsl:template> 

Oficialmente, node() no es una función que es una prueba, pero puede devuelve un valor que es igual que el XmlNode.InnerXml propiedad.

+0

No estoy seguro de qué se supone que significa esto, pero su XPath es semánticamente diferente de la respuesta de ChaosPandion. –

+0

Parece que no estoy claro en mi pregunta, ¿puedo tener una función que acepte el nodo como parámetro? En caso afirmativo, ¿puedo tener una sintaxis de código de muestra? –

+0

Pavel, soy consciente de que .InnerXml es diferente de .OuterXml --- y que/MyNode/node() es diferente de/MyNode. – rasx

-1

En su pregunta:

¿Puedo enviar el > elemento < libro a una función - dentro de esa función Quiero procesar los linfáticos de libro (<autor>, <precio> o < años >)

y posteriormente comentario:

¿puedo tener una función que acepte el nodo como parámetro?

... que está pidiendo una función, pero lo creo que se desea es un template para el elementobook.

Por supuesto, usted podría hacer esto varias maneras - en un bucle for-each, en realidad enviando el nodo book en una plantilla usando with-param, etc .--, pero un simple template debe lograr lo que usted necesita. Lo que sea que la plantilla coincida es el "parámetro".

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

<xsl:template match="books"> 
    <xsl:apply-templates select="book"/> 
</xsl:template> 

<xsl:template match="book"> 
    author: <xsl:value-of select="author" /> 
    price: <xsl:value-of select="price" /> 
    year: <xsl:value-of select="year" /> 
</xsl:template> 

</xsl:stylesheet> 

Si quieres hacer algún procesamiento ulterior en los sub-elementos (autor, precio, y año), usted podría mirar en la creación de plantillas para ellos también. Tenga en cuenta que el "año" correspondiente coincidirá con todos los elementos del año, incluso los que pueda tener en la fecha de nacimiento, etc.(En estos casos, es probable que desee restringir el XPath en la coincidencia o simplemente mantener el proceso book/year dentro de la plantilla del libro.) Supongamos que desea hacer algo adicional con year. Su procesamiento libro podría convertirse en algo como esto (donde ahora estás pasando cada year nodo como parámetros en la plantilla años):

<xsl:template match="book"> 
    author: <xsl:value-of select="author" /> 
    price: <xsl:value-of select="price" /> 
    <xsl:apply-templates select="year" /> 
</xsl:template> 

<xsl:template match="year"> 
    <xsl:choose> 
     <xsl:when test="year &lt; '2000'"> 
     from a prior century: <xsl:value-of select="." /> 
     </xsl:when> 
     <xsl:otherwise> 
     from this century: <xsl:value-of select="." /> 
     </xsl:otherwise> 
    </xsl:choose> 
</xsl:template> 
+0

Estoy buscando una función XSLT, que acepta un nodo (básicamente, cualquier nodo que pueda ser) como un param a la función XSLT?Si es así, ¿puedo tener la sintaxis para la función XSLT? –

0

Hay un montón de funciones XSLT que aceptan nodos como parámetros. Por ejemplo, todos los argumentos de concat puede haber nodos, por ejemplo .:

concat(myelement, myelement/@myattribute) 

Si bien esto responde precisamente la pregunta que hiciste, apostaría dinero de plegamiento que no es la pregunta que los inquietaban. Pero diablos, lo preguntaste cuatro veces, así que aquí tienes.

Editar

En realidad, los atributos no son nodos; solo los elementos, el texto, los comentarios, las instrucciones de procesamiento y las secciones CDATA son nodos. Pero el ejemplo anterior todavía responde la pregunta correctamente.

Cuestiones relacionadas