2009-08-28 21 views
6

Posso inviare un nodo a una funzione XSLT? Per esempio:Come posso inviare un nodo (qualsiasi) a una funzione xsl:?

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

Posso inviare l'elemento <book> a una funzione - all'interno di tale funzione voglio elaborare i nodi sotto libro (<author>, <price> o <year>)

posso creare un xsl: funzione di sotto ?

<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 ? 

Sembra che ho creato molta confusione a ciascuno in base alla funzione invece di xsl dire: la funzione ---- :(

+0

stai chiedendo per le persone a scrivere il codice vero e proprio per te? Questo non funzionerà molto bene, temo ... – Tomalak

+0

Data la formulazione della domanda ("funzione", ecc.) E il desiderio di elaborare semplicemente il nodo, penso che @unknown sia piuttosto nuovo per xslt. E alcuni esempi di codice che utilizzano libri/libri potrebbero aiutare, in particolare per altri neofiti di xslt che trovano questa domanda in una ricerca. –

+0

Sto cercando una funzione XSLT, che accetta un nodo (praticamente qualsiasi nodo che possa essere) come parametro per la funzione XSLT? Se sì, posso avere la sintassi per la funzione XSLT? –

risposta

8

Penso che la risposta alla tua domanda sia, sì. È possibile inviare un nodo a una funzione XSLT.

Se vi state chiedendo cosa usare per il valore dell'attributo as = "", avete diverse scelte. Se vuoi essere molto rilassato e accettare qualsiasi cosa, usa come = "item() *".

From David Pawson's site:

item() * .. sorta di serie di nodi? W3C

Sì, sono d'accordo sembra abbastanza senza significato non lo è. Però. A partire da CR, è piuttosto essenziale, in particolare lo se si desidera utilizzare i tipi. E voglio generare, diciamo, un nodeset .. scusa sequenza , in una variabile.

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

Questo crea una variabile che può incidere ad utilizzare XPath abbastanza prontamente. Cioè ricorda l'elemento() *.

tipi ... alcuni esempi. W3C

Da un messaggio esplicativo di Mike Kay, grazie Mike. Esempi:

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

il valore del parametro può essere qualsiasi elemento (cioè un nodo o valore atomico). Ma è deve essere un singolo elemento.

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

il parametro può essere un singolo elemento o una sequenza vuota

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

il parametro deve essere una sequenza di uno o più articoli - una sequenza vuota non è consentito

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

il parametro può essere una qualsiasi sequenza di zero o più elementi - non vi sono vincoli sul suo valore.

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

il parametro può essere qualsiasi sequenza di zero o più nodi

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

il parametro può essere qualsiasi sequenza di zero o più valori atomici (es interi, stringhe, o booleani).

elemento() * è il tipo più generale possibile, corrisponde a tutto, come "Oggetto" in Java. Per questo motivo, di solito è possibile omettere lo . Ma non sempre, per esempio il tipo predefinito in xsl: variabile non è item() * ma documento nodo(), per garantire che

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

continua a comportarsi come XSLT 1.0

Usare questi per specificare i parametri, tipi di variabili ecc

0

XSL non importa ciò che il parametro è Tratta davvero tutto come. XML. Se il testo viene passato in esso viene trattato come un nodo di testo.

Ecco un esempio con un link per ulteriore riferimento.

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

Sto cercando una funzione XSLT, che accetta un nodo (praticamente qualsiasi nodo che possa essere) come parametro per la funzione XSLT? Se sì, posso avere la sintassi per la funzione XSLT? –

+0

Stai guardando. – ChaosPandion

-1

Per aggiungere alla risposta ChaosPandion potrebbe essere necessario aggiungere un node test alla query 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> 

Ufficialmente, node() non è una funzione che è un test, ma può restituisce un valore che è come il XmlNode.InnerXml proprietà.

+0

Non sei sicuro di cosa significhi questo, ma il tuo XPath è semanticamente diverso dalla risposta di un ChaosPandion. –

+0

Sembra che non sia chiaro nella mia domanda, posso avere una funzione che accetta il nodo come parametro? Se sì, posso avere una sintassi del codice di esempio? –

+0

Pavel, sono consapevole del fatto che .InnerXml è diverso da .OutOXml --- e che/MyNode/node() è diverso da/MyNode. – rasx

-1

Nella tua domanda:

Posso inviare il <libro> elemento a una funzione - all'interno di tale funzione voglio elaborare i nodi sotto libro (<autore>, <prezzo> o <anni>)

e commentare in seguito:

posso avere una funzione che accetta il nodo come parametro?

... stai chiedendo per una funzione, ma ciò che Penso che si desidera è un template per la book elemento.

Naturalmente, si potrebbe fare questo in diversi modi - in un ciclo for-each, in realtà l'invio il nodo book in un modello utilizzando with-param, ecc .-- ma un semplice template dovrebbe compiere ciò che vi serve. Qualunque sia la corrispondenza del modello è il "parametro".

<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> 

Se si vuole fare qualche ulteriore elaborazione sui sotto-elementi (autore, prezzo, e anno), si potrebbe guardare in creazione di modelli anche per loro. Tieni presente che l'abbinamento "anno" corrisponderà a a tutti gli elementi anni, anche per quelli che potresti avere in data di nascita, ecc.(In questi casi, probabilmente si vorrebbe limitare l'XPath nella partita o mantenere l'elaborazione book/year all'interno del modello di libro.) Dire di voler fare qualcosa in più con year. La vostra elaborazione libro potrebbe evolvere in qualcosa di simile (dove si sta ora passando ogni nodo year come parametri nel modello anno):

<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

Sto cercando una funzione XSLT, che accetta un nodo (praticamente qualsiasi nodo che possa essere) come parametro per la funzione XSLT?Se sì, posso avere la sintassi per la funzione XSLT? –

0

Ci sono un sacco di funzioni XSLT che accettano nodi come parametri. Per esempio, tutti gli argomenti di concat possono essere nodi, ad es .:

concat(myelement, myelement/@myattribute) 

Anche se questo risponde proprio la domanda che hai posto, Sono pronto a scommettere soldi che non è la questione si voleva risposto pieghevole. Ma diamine, l'hai chiesto quattro volte, quindi eccoti qui.

Modifica

In realtà, gli attributi non sono nodi; solo gli elementi, il testo, i commenti, le istruzioni di elaborazione e le sezioni CDATA sono nodi. Ma l'esempio sopra risponde ancora correttamente alla domanda.

Problemi correlati