Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
XPath (XML Path Language) supporta l'operazione sugli insiemi |.
Operatore union (|)
L'operatore | o union restituisce l'unione dei due operandi, che devono essere set di nodi. Ad esempio, //author | //publisher restituisce un set di nodi che combina tutti i nodi //author e //publisher. È possibile concatenare più operatori union per combinare più set di nodi. Ad esempio, //author | //publisher | //editor | //book-seller restituisce un set di nodi contenente tutti gli elementi //author, //publisher, //editor e //book-seller elements. L'operatore union preserva l'ordine dei documenti e non restituisce duplicati.
Esempi
| Espressione | Si riferisce a |
|---|---|
|
Un set di nodi contenente gli elementi |
|
Un set di nodi contenente gli elementi |
|
Un set di nodi contenente tutti gli elementi |
|
Un set di nodi contenente tutti gli elementi |
Esempio
Nell'esempio seguente viene illustrato l'utilizzo dell'operatore union.
File XML (test.xml)
<?xml version="1.0"?>
<test>
<x a="1">
<x a="2" b="B">
<x>
<y>y31</y>
<y>y32</y>
</x>
</x>
</x>
</test>
File XSLT (test.xsl)
Il seguente foglio di stile XSLT seleziona tutti gli elementi <x> in cui l'attributo a è uguale a 2 e tutti gli elementi che <x> che non presentano attributi.
<?xml version='1.0'?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" omit-xml-declaration="yes" indent="yes"/>
<!-- Suppress text nodes not covered in subsequent template rule. -->
<xsl:template match="text()"/>
<!-- Handles a generic element node. -->
<xsl:template match="*">
<xsl:element name="{name()}">
<xsl:apply-templates select="*|@*" />
<xsl:if test="text()">
<xsl:value-of select="."/>
</xsl:if>
</xsl:element>
</xsl:template>
<!-- Handles a generic attribute node. -->
<xsl:template match="@*">
<xsl:attribute name="{name()}">
<xsl:value-of select="."/>
</xsl:attribute>
</xsl:template>
<xsl:template match="/test">
<xsl:apply-templates select="//x[@a=2] | //x[not(@*)]"/>
</xsl:template>
</xsl:stylesheet>
La trasformazione restituisce il seguente risultato:
<x a="2" b="B">
<x>
<y>31</y>
<y>y32</y>
</x>
</x>
<x>
<y>y31</y>
<y>y32</y>
</x>
Precedenza
L'ordine di precedenza (dalla priorità più alta a quella più bassa) tra gli operatori di confronto e booleani viene visualizzato nella seguente tabella.
| Precedenza | Operatori | Descrizione |
|---|---|---|
1 |
|
Raggruppamento |
2 |
|
Filtri |
3 |
|
Operazioni di percorso |
4 |
|
Confronti |
5 |
|
Confronti |
6 |
|
Union |
7 |
|
NOT booleano |
8 |
|
AND booleano |
9 |
|
OR booleano |
Esempio
Nell'esempio seguente viene illustrato l'effetto della precedenza degli operatori elencata in precedenza.
File XML (test.xml)
<?xml version="1.0"?>
<test>
<x a="1">
<x a="2" b="B">
<x>
<y>y31</y>
<y>y32</y>
</x>
</x>
</x>
<x a="1">
<x a="2">
<y>y21</y>
<y>y22</y>
</x>
</x>
<x a="1">
<y>y11</y>
<y>y12</y>
</x>
<x>
<y>y03</y>
<y>y04</y>
</x>
</test>
File XSLT di base (test.xsl)
Il file XSLT di base sarà utilizzato come punto di partenza per la serie di spiegazioni che seguono.
<?xml version='1.0'?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" omit-xml-declaration="yes" indent="yes"/>
<!-- Suppress text nodes not covered in subsequent template rule. -->
<xsl:template match="text()"/>
<!-- Handles a generic element node. -->
<xsl:template match="*">
<xsl:element name="{name()}">
<xsl:apply-templates select="*|@*" />
<xsl:if test="text()">
<xsl:value-of select="."/>
</xsl:if>
</xsl:element>
</xsl:template>
<!-- Handles a generic attribute node. -->
<xsl:template match="@*">
<xsl:attribute name="{name()}">
<xsl:value-of select="."/>
</xsl:attribute>
</xsl:template>
</xsl:stylesheet>
Caso 0: esecuzione di verifiche
È possibile aggiungere la seguente regola di modello al foglio di stile XSLT.
<xsl:template match="/test">
<xsl:apply-templates select="*|@*/>
</xsl:template>
Ciò produce un documento XML identico all'originale senza l'istruzione di elaborazione <?xml version="1.0"?>.
Nei casi seguenti sono descritti diversi modi per scrivere questa regola di modello. Lo scopo è illustrare l'ordine in cui gli operatori XPath si associano a un elemento.
Caso 1: () è un'associazione più forte di []
La seguente regola di modello seleziona il primo elemento <y> nell'ordine del documento tra tutti gli elementi <y> nel documento di origine.
<xsl:template match="/test">
<xsl:apply-templates select="(//y)[1]"/>
</xsl:template>
Il risultato è il seguente:
<y>y31</y>
Caso 2: [] è un'associazione più forte di / o //
La seguente regola di modello seleziona tutti gli elementi <y> che sono i primi di pari livello.
<xsl:template match="/test">
<xsl:apply-templates select="//y[1]"/>
</xsl:template>
Il risultato è il seguente:
<y>y31</y>
<y>y21</y>
<y>y11</y>
<y>y03</y>
Caso 3: AND, NOT
La seguente regola di modello seleziona tutti gli elementi <x> che non hanno elementi figlio <x>, che hanno un elemento padre <x> e che non hanno attributi.
<xsl:template match="/test">
<xsl:apply-templates select=
"//x[./ancestor::*[name()='x'] and *[name()!='x'] and not(@*)]"/>
</xsl:template>
Il risultato è un singolo elemento <x>, elencato di seguito con i relativi elementi figlio:
<x>
<y>y31</y>
<y>y32</y>
</x>
Caso 4: OR, AND, NOT
La seguente regola di modello seleziona ogni elemento <x> che è un elemento figlio di <x> o che non è un elemento padre di <x> e che non presenta attributi.
<xsl:template match="/test">
<xsl:apply-templates select=
"//x[./ancestor::*[name()='x'] or *[name()!='x'] and not(@*)]"/>
</xsl:template>
Il risultato è un set di nodi contenente gli elementi <x> elencati di seguito con i relativi elementi figlio:
<x a="2" b="B">
<x>
<y>y31</y>
<y>y32</y>
</x>
</x>
<x>
<y>y31</y>
<y>y32</y>
</x>
<x a="2">
<y>y21</y>
<y>y22</y>
</x>
<x>
<y>y03</y>
<y>y04</y>
</x>
Caso 5: AND, OR, NOT
La seguente regola di modello seleziona ogni elemento <x> che è un elemento figlio di <x> ma che non è un elemento padre di <x> oppure che non presenta attributi.
<xsl:template match="/test">
<xsl:apply-templates select=
"//x[./ancestor::*[name()='x'] and *[name()!='x'] or not(@*)]"/>
</xsl:template>
Il risultato è un set di nodi contenente gli elementi <x> elencati di seguito con i relativi elementi figlio:
<x>
<y>y31</y>
<y>y32</y>
</x>
<x a="2">
<y>y21</y>
<y>y22</y>
</x>
<x>
<y>y03</y>
<y>y04</y>
</x>