Pattern di Xsl
Introduzione
Un foglio di stile XSL è un documento XML che utilizza un DTD (Document Type Definition: definizione dei tipi nel documento) i cui elementi hanno senso noto al motore XSLT. Un foglio di stile XSL è composto sostanzialmente di template di costruzione, che permettono di riscrivere una selezione elementi del documento XML d’origine in altri elementi del documento destinazione. Ogni template individua un pattern da ricercare nel documento di partenza, e vi associa un blocco di elementi e testo da inserire nel documento di destinazione XSLT si basa fondamentalmente su XPath per questi pattern. L’inclusione di XPath (del gruppo di lavoro XLink) ha costituito una notevole modifica rispetto alle prime proposte.
2.1 Sintassi Pattern
Un pattern è utilizzato per individuare i nodi dell'albero d'origine a cui applicare le regole di trasformazione definite in un template. Ogni pattern specifica un insieme di condizioni riguardanti un nodo mediante un'espressione XPath. Se un nodo verifica queste condizioni, viene scelto per l'applicazione delle trasformazioni associate al pattern.
La specifica XSLT definisce in modo rigoroso la sintassi e la semantica dei pattern. Le principali regole di selezione esprimibili mediante un pattern sono le seguenti:
- item seleziona tutti gli elementi denominati item;
- * seleziona qualsiasi elemento;
- parent/child seleziona tutti gli elementi denominati child il cui padre si chiama parent;
- / seleziona la radice dell'albero;
- text() seleziona nodi di tipo testo;
- @att seleziona l'attributo di nome att;
- item[@name=``foo''] seleziona gli elementi denominati item che hanno un attributo chiamato name, il cui valore è foo;
- @* seleziona qualsiasi attributo
Un template è un insieme di regole specificate mediante l'elemento <xsl:template>. La sintassi completa è la seguente:
<xsl:template
match = pattern
name = qualified-name
priority = number
mode = qualified-name>
</xsl:template>
Il valore dell'attributo match è un pattern che individua i nodi a cui applicare le regole del template.
Riportiamo un semplice esempio; il documento XML a cui vengono applicate le trasformazioni XSLT, identifica una classe di un diagramma UML delle classi mediante l'elemento <Foundation.Core.Class>. Per generare il codice Java delle classi definite nel documento XMI, è necessario reperire tutti gli elementi di questo tipo ed applicare ad essi determinate trasformazioni:
<xsl:template match="Foundation.Core.Class">
<UML.Code.Class>
<!-- nome della classe -->
<xsl:apply-templates
select="Foundation.Core.ModelElement.name"/>
<!-- attributi della classe -->
<xsl:call-template name="attributes"/>
[...]
</UML.Code.Class>
</xsl:template>
Per ogni classe viene creato un elemento chiamato <UML.Code.Class>. Per ricavare tutte le informazioni necessarie riguardanti una determinata classe, vengono applicati ulteriori template. Questo può avvenire in due modi:
- utilizzando l'istruzione <xsl:apply-templates>, che processa tutti i nodi figli di quello corrente, selezionando quelli specificati mediante l'attributo select. Nell'esempio precedente, l'istruzione <xsl:apply-templates select="Foundation.Core.ModelElement.name"/>, seleziona tutti gli elementi chiamati <Foundation.Core.ModelElement.name>, partendo dal nodo <Foundation.Core.Class>. Se esiste un template relativo all'elemento <Foundation.Core.ModelElement.name>, esso viene applicato. Ad esempio:
<xsl:template match="Foundation.Core.ModelElement.name"> <xsl:attribute name="name"> <xsl:value-of select="text()"/> </xsl:attribute> </xsl:template>Mediante questo template viene aggiunto l'attributo name all'elemento <UML.Code.Class>, creato ogni volta che viene individuata una classe nel documento XML processato. - Utilizzando l'istruzione <xsl:call-template>, che consente di invocare un determinato template utilizzando il nome associato ad esso. Solitamente si preferisce utilizzare l'istruzione <xsl:call-template> al posto di <xsl:apply-templates> quando il numero di regole da applicare è piuttosto numeroso: dividendo lo stylesheet in diversi template identificati da nomi differenti, si ottiene una struttura più elegante e più comprensibile. In riferimento all'esempio precedente, l'istruzione <xsl:call-template name="attributes"/> consente di invocare il template di nome attributes, il cui scopo è ricavare dal documento XML tutti gli attributi di una classe.







