2010-05-01 9 views
6

Est-il possible d'utiliser XSLT pour transformer XML en autre chose que XML?XSLT: Transformation en contenu non-xml?

par exemple. je veux la finale non-xml contenu:

<Content> 
    <image url="file1.png"> 
    <image url="file2.png"> 
    ... 
    <image url="filen.png"> 
<EndContent> 

vous êtes avis ce document n'est pas xml (ou même html), mais il ne <elements>.

Est-il possible, en utilisant XSLT, de générer une sortie non-XML?


Un autre exemple de la production non-xml pourrait être:

<HTML> 
<BODY> 
    <IMG src="file1.png"><BR> 
    <IMG src="file2.png"><BR> 
    ... 
    <IMG src="filen.png"><BR> 
</BODY> 
</HTML> 

Vous remarquerez ce document est HTML, parce que dans les balises HTML IMG et BR sont interdit d'avoir une fermeture marque. Cela contrastes avec xhtml, la reformulation de HTML en utilisant xml, où tous les éléments sont nécessaires à partir d'avoir une balise de fermeture (car en XML, chaque balise doit être fermée).


Un autre exemple de la production non-xml pourrait être:

INSERT INTO Documents (Filename) VALUES ('file1.png') 
INSERT INTO Documents (Filename) VALUES ('file2.png') 
... 
INSERT INTO Documents (Filename) VALUES ('file3.png') 

je peux faire en toute xml source j'aime, mais un exemple pourrait être:

Source xml:

<DocumentStore> 
    <Document type="image">file1.png</Document> 
    <Document type="image">file2.png</Document> 
    <Document type="image">filen.png</Document> 
</DocumentStore>  

Ou peut-être:

<Profiles> 
    <User avatar="file1.png" /> 
    <User avatar="file2.png" /> 
    <User avatar="filen.png" /> 
</Profiles> 
+0

Quel est le problème avec '' et '
'? – kennytm

+0

@KennyTM: HTML interdit la fermeture des tags sur IMG et BR. Ce n'est pas que les tags de fermeture sont offensants. C'est juste que le bon HTML ne les aura pas. –

Répondre

1

Oui, vous pouvez, en utilisant l'élément xsl:output dans votre feuille de style.

8

Vous pouvez utiliser <xsl:output> pour spécifier le format de sortie, qui n'a pas à être xml, voir this reference page.

Toutefois, si vous produisez html, aucun navigateur moderne devrait se plaindre même si vous mettez les balises de fermeture, donc en utilisant votre exemple ci-dessus, je crois que tout navigateur devrait être ok avec: -

<HTML> 
<BODY> 
    <IMG src="file1.png"></IMG><BR></BR> 
    <IMG src="file2.png"></IMG><BR></BR> 
    ... 
    <IMG src="filen.png"></IMG><BR></BR> 
</BODY> 
</HTML> 

Alors Je ne sais pas trop pourquoi vous ne voulez pas mettre la balise de fermeture, à moins que je ne manque quelque chose.


Mise à jour: exemple ajouté de la production non xml

Compte tenu de cette feuille de style: -

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="text" /> 
    <xsl:template match="/filenames"> 

    <xsl:for-each select="filename"> 
    INSERT INTO Documents (Filename) VALUES ('<xsl:value-of select="." />') 
    </xsl:for-each> 

    </xsl:template> 
</xsl:stylesheet> 

et cette entrée xml: -

<?xml version="1.0" encoding="UTF-8"?> 
<filenames> 
    <filename>file1.png</filename> 
    <filename>file2.png</filename> 
    <filename>file3.png</filename> 
</filenames> 

Vous obtenez une sortie comme ceci: -

INSERT INTO Documents (Filename) VALUES ('file1.png') 

INSERT INTO Documents (Filename) VALUES ('file2.png') 

INSERT INTO Documents (Filename) VALUES ('file3.png') 
+0

@Alan Chan: Ce n'est pas tant la génération de code HTML invalide que les navigateurs peuvent traiter; Il génère du code HTML valide pour que les parseurs puissent le gérer. –

+0

@Ian: ok je vois. Eh bien, si vous utilisez pour spécifier que la sortie est html, puis utilisez pour créer les balises html ... par ex. fichier1.png alors le processeur xslt doit produire les balises ,
, etc. sans la balise de fermeture requise pour html. –

4

Peu importe la façon dont vous créez vos balises IMG,

<?xml version="1.0"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="html"/> 
<xsl:template match="/"> 
<HTML> 
<BODY> 
    <xsl:element name="IMG"> 
    <xsl:attribute name="src">file1.png</xsl:attribute> 
    </xsl:element> 
    <IMG src="file2.png"></IMG> 
    <IMG src="filen.png"/> 
</BODY> 
</HTML> 
</xsl:template> 
</xsl:stylesheet> 

La méthode de sortie « html » provoque les balises IMG à ne pas être fermé.

<HTML> 
<BODY><IMG src="file1.png"><IMG src="file2.png"><IMG src="filen.png"></BODY> 
</HTML> 
+0

Lorsque je le reproduis, les étiquettes de fermeture sont incluses. Dans le même temps, je voudrais parfois inclure des balises de fermeture optionnelles, et parfois je ne le souhaite pas. XSLT doit être capable de transformer xml dans mon format de sortie ** désiré **. –

Questions connexes