2010-11-08 8 views
3

Je viens de commencer à apprendre XSLT, maintenant je suivais un certain tutoriel en ligne de celui-ci, et j'ai juste une simple question maintenant:une question débutant sur XSLT

supposons que nous avons un fichier XML d'origine, avons-nous besoin écrire une feuille de style XSLT pour l'accompagner, ou est-ce que nous passons simplement le fichier xml dans un logiciel tel que Stylus Studio (Saxon Engine), alors il va faire toutes ces choses automatiquement pour nous?

Désolé pour la mise clarifier.J'ai besoin de convertir ce fichier .svg en format pdf, je suis juste au début du développement, donc vraiment confus au sujet de la première étape.Aussi, je voudrais savoir, si mon entrée initiale est un fichier .svg, dois-je le transformer explicitement en .xml avant de pouvoir commencer à utiliser XSLT?

Merci d'avance!

+2

Cela dépend de ce que vous essayez de faire. Qu'attendez-vous de la feuille de style XSLT, quelle transformation devrait se produire? – flash

+2

Cette question est un peu floue. Quel est le résultat que vous attendez? À quoi utilisez-vous le XSLT? – vcsjones

Répondre

8

Désolé pour la mise clarifier.J'ai besoin de convertir ce fichier .svg en format pdf, je suis juste maintenant au début du développement, donc vraiment confus au sujet de la première étape.En outre, je voudrais savoir, si mon entrée initiale est un fichier .svg, dois-je explicitement le transformer en un fichier .xml avant de pouvoir commencer à utiliser XSLT?

Un fichier SVG est un fichier XML dans l'espace de noms SVG. Que vous ayez besoin ou non de transformer ce code XML dépend de la façon dont vous allez l'utiliser. Si vous deviez faire une impression par lots en utilisant quelque chose comme Inkscape (un éditeur SVG), vous ne le feriez pas.

Si vous allez utiliser quelque chose comme XSL-FO, vous le feriez. La réponse de @Zoltan Hamori est un peu trompeuse. Vous pouvez utiliser saxon pour effectuer une transformation XSLT (création du XSL-FO), mais vous aurez toujours besoin d'un processeur XSL-FO pour créer le PDF à partir du XSL-FO. Zoltan mentionne FOP (Processeur d'objets de formatage Apache), mais il donne l'impression que FOP et XSL-FO sont les mêmes; ils ne sont pas. Son exemple de code est une table XSL-FO (XML dans l'espace de noms fo). Vous auriez besoin d'un processeur tel que FOP, RenderX, Antenna House, etc. pour créer le PDF à partir du XSL-FO.

Fondamentalement, ce que vous avez besoin est:

  1. entrée XML (ce serait votre fichier SVG)
  2. transformation XSLT pour créer le XSL-FO.
  3. processeur XSL-FO pour créer le PDF de la XSL-FO

Apprendre le XSL-FO en même temps que vous apprenez XSLT va être difficile, mais je vais vous montrer deux façons de afficher un fichier SVG dans un fichier PDF.

La première façon est de faire référence au fichier SVG en utilisant fo:external-graphic.

La deuxième méthode consiste à incorporer le fichier XML SVG directement dans le fichier XSL-FO en utilisant fo:instream-foreign-object.

Depuis l'entrée XML est le XML SVG, je voudrais aller avec la deuxième option. Cependant, je ne suis pas sûr de l'effet que cela a sur le temps de traitement et de quelle façon serait plus efficace.

J'ai montré un exemple ci-dessous. Depuis que j'ai montré les deux façons de produire un SVG, cela va créer un PDF de 2 pages. Chaque page aura le graphique SVG.

Remarques

  • Pour les tests, j'ai utilisé un exemple de fichier SVG fourni avec Inkscape. (J'ai enlevé la plus grande partie du SVG XML de la sortie XSL-FO parce que c'est assez gros.)
  • Pour mon processeur XSLT, j'ai utilisé Saxon-HE 9.2.0.6.
  • Pour mon processeur FO, j'ai utilisé Apache FOP Version 0.95 (bien que je préfère RenderX).

également

  • deux Saxon-HE et Apache FOP sont gratuits.
  • Si vous me donnez votre email, je peux vous envoyer le fichier SVG que j'ai utilisé avec la sortie XSL-FO complète. Je peux également vous envoyer le PDF qui a été créé.

XSLT 2,0

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format" xmlns:svg="http://www.w3.org/2000/svg"> 
    <xsl:output indent="yes"/> 
    <xsl:strip-space elements="*"/> 

    <!-- 
    This is an "identity" template. 
    It copies whatever node from input to the output without changing it. 
    Learn it. Use it. Love it. --> 
    <xsl:template match="node()|@*"> 
    <xsl:copy> 
     <xsl:apply-templates select="node()|@*"/> 
    </xsl:copy> 
    </xsl:template> 

    <xsl:template match="/"> 
    <fo:root> 
     <fo:layout-master-set> 
     <fo:simple-page-master master-name="my-page"> 
      <fo:region-body/> 
     </fo:simple-page-master> 
     </fo:layout-master-set> 
     <fo:page-sequence master-reference="my-page"> 
     <fo:flow flow-name="xsl-region-body"> 
      <fo:block> 
      <!-- This is the first way to output an SVG; by referencing the graphic. --> 
      <fo:external-graphic src="test.svg"/> 
      <!-- This is the second way to output an SVG; by outputting the SVG XML directly. --> 
      <fo:instream-foreign-object> 
       <xsl:apply-templates/> 
      </fo:instream-foreign-object> 
      </fo:block> 
     </fo:flow> 
     </fo:page-sequence> 
    </fo:root> 
    </xsl:template> 

</xsl:stylesheet> 

XSL-FO (créé par Saxon d'entrée SVG et feuille de style XSL)

<?xml version="1.0" encoding="UTF-8"?> 
<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format" xmlns:svg="http://www.w3.org/2000/svg"> 
    <fo:layout-master-set> 
     <fo:simple-page-master master-name="my-page"> 
     <fo:region-body/> 
     </fo:simple-page-master> 
    </fo:layout-master-set> 
    <fo:page-sequence master-reference="my-page"> 
     <fo:flow flow-name="xsl-region-body"> 
     <fo:block> 
      <fo:external-graphic src="test.svg"/> 
      <fo:instream-foreign-object> 
       <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" 
        version="1.1" 
        width="595.99438" 
        height="491.50516" 
        id="svg2675"> 
       <!-- CONTENT REMOVED FOR STACKOVERFLOW.COM EXAMPLE --> 
       </svg> 
      </fo:instream-foreign-object> 
     </fo:block> 
     </fo:flow> 
    </fo:page-sequence> 
</fo:root> 

Hope this helps.

+0

Merci beaucoup, DevNull, pourriez-vous s'il vous plaît écrivez-moi votre svg? Merci.Mon email est [email protected] – Kevin

+0

Aussi, j'ai une question, la feuille de style XSL et XSL-FO que vous avez fourni travailler avec tout le fichier svg ou ne fonctionnera qu'avec votre fichier svg spécifique? Merci – Kevin

+0

@Robert - La feuille de style XSL devrait fonctionner avec tous les fichiers svg.Je voudrais supprimer le 'fo: external-graphic' cependant. Si vous voulez utiliser 'fo: external-graphic' à la place de' fo: instream-foreign-object', vous devrez passer le nom du fichier svg en paramètre. Je vous enverrai le svg et le fichier XSL-FO complet. –

-1

Svg est un fichier Xml. Ainsi, vous pouvez commencer à écrire votre propre feuille de style XSLT pour la transformer dans le format désiré.

Mais une recherche rapide sur Google m'a montré beaucoup de programmes qui peuvent faire cette conversion pour vous.

+0

merci, flash, vous voulez dire google pour convertir svg en pdf? – Kevin

+0

Non, si vous voulez seulement convertir un svg en pdf, essayez d'utiliser un moteur de recherche (par exemple Google) pour rechercher les programmes qui peuvent effectuer cette conversion. – flash

1

Si vous souhaitez convertir des données au format PDF, vous pouvez utiliser XSL: FO/FOP. Vous avez besoin d'un modèle FOP qui est un fichier xsl et qui peut être converti en PDF. Ce fichier xsl peut faire référence à XML, à des objets externes comme des fichiers image ou vous pouvez utiliser freemarker/velocity pour mettre des données dans le modèle XSL.

Vous trouverez de plus amples informations: http://www.treebuilder.de/svg/extentSVG/artikel/tut.html

Si vous utilisez des balises de FOP, vous pouvez faire référence au fichier SVG comme:

<fo:table text-align="left" table-layout="fixed" 
             background-image="SVG_file.svg"> 

Je pense qu'il est possible d'ajouter le fichier svg Saxon en tant que paramètre

+0

Supposons maintenant que je vais utiliser Saxon en Java pour faire cette conversion, dois-je vous comprendre comme le fichier svg comme l'entrée xml et le dit modèle FOP comme le xml dans la commande Saxon? – Kevin