(PHP 4 >= 4.0.6)
xslt_set_sax_handlers — Configure les gestionnaires SAX qui seront appelés pour gérer les documents XML
xslt_set_sax_handlers() enregistre le gestionnaire SAX handlers pour le document, en lui donnant une ressource XSLT processor .
Le paramètre handlers doit être un tableau qui suit ce format :
<?php
$handlers
= array(
"document"
=> array(
"start_doc"
,
"end_doc"
),
"element"
=> array(
"start_element"
,
"end_element"
),
"namespace"
=> array(
"start_namespace"
,
"end_namespace"
),
"comment"
=>
"comment"
,
"pi"
=>
"pi"
,
"character"
=>
"characters"
);
?>
Note: Le tableau fourni n'a pas besoin de contenir tous les éléments différents du gestionnaire SAX (bien qu'il le peut), mais il doit uniquement être conforme au format "gestionnaire" => "fonction" décrit ci-dessus.
Chacune des fonctions du gestionnaire SAX correspond au format suivant :
start_doc
( resource $processor )
end_doc
( resource $processor )
start_element
( resource $processor, string $name, array $attributes )
end_element
( resource $processor, string $name )
start_namespace
( resource $processor, string $prefix, string $uri )
end_namespace
( resource $processor, string $prefix )
comment
( resource $processor, string $contents )
pi
( resource $processor, string $target, string $contents )
characters
( resource $processor, string $contents )
Utiliser la fonction xslt_set_sax_handlers() n'est pas vraiment différent qu'exécuter un analyseur SAX comme xml_parse() sur un résultat de la transformation xslt_process() .
Exemple 2848. Exemple avec xslt_set_sax_handlers()
<?php
// Fournit par ohlesbeauxjours at yahoo dot fr
// Voici un exemple simple qui applique la fonction strtoupper()
// sur le contenu de chaque balise <auteur> et affiche
// le résultat sous forme d'arbre XML :
$xml
=
'<?xml version="1.0"?>
<books>
<book>
<title>Mme Bovary</title>
<author>Gustave Flaubert</author>
</book>
<book>
<title>Mrs Dalloway</title>
<author>Virginia Woolf</author>
</book>
</books>'
;
$xsl
=
'<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" encoding="ISO-8859-1" indent="no" omit-xml-declaration="yes"/>
<xsl:template match="/">
<xsl:for-each select="books/book">
<livre>
<auteur><xsl:value-of select="author/text()"/></auteur>
</livre>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>'
;
// Gestionnaire :
function
start_document
()
{
// début de la lecture du document
}
function
end_document
()
{
// fin de la lecture du document
}
function
start_element
(
$parser
,
$name
,
$attributes
)
{
global
$result
,
$tag
;
$result
.=
"<"
.
$name
.
">"
;
$tag
=
$name
;
}
function
end_element
(
$parser
,
$name
)
{
global
$result
;
$result
.=
"</"
.
$name
.
">"
;
}
function
characters
(
$parser
,
$data
)
{
global
$result
,
$tag
;
if (
$tag
==
"auteur"
) {
$data
=
strtoupper
(
$data
);
}
$result
.=
$data
;
}
// Transformation :
$xh
=
xslt_create
();
$handlers
= array(
"document"
=> array(
"start_document"
,
"end_document"
),
"element"
=> array(
"start_element"
,
"end_element"
),
"character"
=>
"characters"
);
xslt_set_sax_handlers
(
$xh
,
$handlers
);
xslt_process
(
$xh
,
'arg:/_xml'
,
'arg:/_xsl'
,
NULL
, array(
"/_xml"
=>
$xml
,
"/_xsl"
=>
$xsl
));
xslt_free
(
$xh
);
?>
Vous pouvez également utiliser la fonction xslt_set_object() si vous voulez implémenter votre gestionnaire dans un objet.
Exemple 2849. Gestionnaire orienté objet
<?php
// Voici la version orientée objet de l'exemple ci-dessus
class
data_sax_handler
{
var
$buffer
,
$tag
,
$attrs
;
var
$_xh
;
function
data_sax_handler
(
$xml
,
$xsl
)
{
// notre ressource xslt
$this
->
_xh
=
xslt_create
();
xslt_set_object
(
$this
->
_xs
,
$this
);
// configuration du gestionnaire sax
$handlers
= array(
"document"
=> array(
'start_document'
,
'end_document'
),
"element"
=> array(
'start_element'
,
'end_element'
),
"character"
=>
'characters'
);
xslt_set_sax_handlers
(
$this
->
_xh
,
$handlers
);
xslt_process
(
$this
->
_xh
,
'arg:/_xml'
,
'arg:/_xsl'
,
NULL
, array(
"/_xml"
=>
$xml
,
"/_xsl"
=>
$xsl
));
xslt_free
(
$this
->
_xh
);
}
function
start_document
()
{
// début de la lecture du document
}
function
end_document
() {
// fin de la lecture du document
}
function
start_element
(
$parser
,
$name
,
$attributes
) {
$this
->
tag
=
$name
;
$this
->
buffer
.=
"<"
.
$name
.
">"
;
$this
->
attrs
=
$attributes
;
}
function
end_element
(
$parser
,
$name
)
{
$this
->
tag
=
''
;
$this
->
buffer
.=
"</"
.
$name
.
">"
;
}
function
characters
(
$parser
,
$data
)
{
if (
$this
->
tag
==
'auteur'
) {
$data
=
strtoupper
(
$data
);
}
$this
->
buffer
.=
$data
;
}
function
get_buffer
() {
return
$this
->
buffer
;
}
}
$exec
= new
data_sax_handler
(
$xml
,
$xsl
);
?>
Les deux exemples ci-dessus afficheront :