IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

XSL/XSLT/XPATH XML Discussion :

[XSL-FO] Erreur FOP


Sujet :

XSL/XSLT/XPATH XML

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 17
    Par défaut [XSL-FO] Erreur FOP
    Bonjour,
    je me trouve bloqué sur un problème de mémoire FOP.

    Pour planter le décors j'ai un Fichier XML qui contient un tableau avec (Ligne+)
    et mon XSL qui affiche chaque ligne sur 2 pages dépendantes.

    La première m'affiche certains critères, la suivante les mêmes lignes avec d'autres critères.

    Pour ce faire j'ai créé deux template PageImpaire et PagesPaire pour afficher l'ensemble de mon tableau , sachant que chacune des lignes visuelles aura sa taille propre (donc impossible de savoir combien de lignes seront affichées par page à l'avance)

    En simplifiant l'algo ça donne

    PageImpaire(0,0) [->CallTemplate] PagePaire(position_init,position_fin)
    [-> CallTemplate] PageImpaire(position_fin+1,nbLigneTotal)
    [->CallTemplate] PagePaire(position_fin+1,nbLigneTot)
    ... en récursif jusqu'a la fin du tableau.

    Pour une quinzaine de page ça passe, mais après plantage ...
    Le message est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    org.apache.fop.fo.FOTreeBuilder$MainFOHandler endElement
    WARNING : Mismatch : page-sequence (http://www.w3.org/1999/XSL/Format) vs. root(http://www.w3.org/1999/XSL/Format)
    java.lang.OutOfMemoryError
    Exception in thread "main"
    Je comprends bien qu'il y a une surcharge de mémoire quelque part... mais je n'arrive pas à la faire disparaitre, le Xprof ne m'indique pas grand chose, le nombre de thread est stable... mais focément à chaque appel récursif j'augmente significativement les ressources utilisées par XPATH sans jamais les libérer...

    Auriez vous une idée pour supprimer ce problème ou du moins une piste qui m'aiderai à avancer? (sachant qu'en plus j'épluche depuis 2-3 jours les ressources de fop)

    Merci d'avance.

    Cdt.

    Alex.

  2. #2
    Expert confirmé
    Avatar de GrandFather
    Inscrit en
    Mai 2004
    Messages
    4 587
    Détails du profil
    Informations personnelles :
    Âge : 55

    Informations forums :
    Inscription : Mai 2004
    Messages : 4 587
    Par défaut
    Bonjour,

    comme tu t'en doutes, ton souci vient de la profondeur de récursion. Ce n'est pas tant XPath (il n'y a pas d'effet de bord avec XPath donc pas de débordement de mémoire) que les appels imbriqués de tes templates nommés avec à chaque fois la sauvegarde du contexte qui posent problème...

    Il va falloir revoir ton algorithme et adopter quelque chose de plus itératif.
    FAQ XML
    ------------
    « Le moyen le plus sûr de cacher aux autres les limites de son savoir est de ne jamais les dépasser »
    Giacomo Leopardi

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 17
    Par défaut
    Merci pour votre réponse.

    Le problème c'est que :
    1/ Ce n'est pas moi qui ait étudié l'algo
    2/ Compte tenu de la portée des variables en XSLT faire une boucle itérative resterai très compliquée. En effet comme je l'expliquais précédement nous ne connaissons pas le nombre de ligne par page, il faudrait donc pouvoir le récupérer à la sortie du template, mais dans le peu de connaisance que j'ai en XSLT les variables sont locales et il n'existe aucun pointeur dessus.
    La solution de facilité serai de dire j'affiche quoi qu'il arrive 20 lignes par exemple mais celà limiterai fortement l'affichage des pages car elles pourraient se retrouver remplie à 100% ou à 10% suivant le type de données :/

    Du coup je me pose une question simple mais qui conceptuellement me dérange fortement ...
    C'est une appli Java qui génère le XML qui pour l'instant à une forme (pour la partie concenant ce problème)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    <tableau +>
        <ligne *>
    ne serait ce pas interessant du coup lors de la génération passer par une structure intermédiaire du style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    <tableau +>
        <page +>
            <ligne *>
    Et du coup transvaser le calcul du nombre de ligne dans une page de mon template à mon code java. Ce n'est pas propre du tout au niveau métier car nous déleguerions à Java une tâche propre au XSLT, mais celà permettrait à coup sur de pouvoir itérer sans soucis.

    Cdt.

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 17
    Par défaut UP...
    Bon et bien j'ai supprimé la récursivité en utilisant la structure décrite précédemment
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    <tableau +>
        <page +>
            <ligne *>
    et avec un algo proche de celui-ci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
     
    <xsl:template name="corps">
      <xsl:apply-templates select="//tableau/page" />
    </xsl:template>
     
    <xsl:template name="Page_XML" match="page">
      <xsl:apply-templates select="." mode="impaire" />
      <xsl:apply-templates select="." mode="paire" />
    </xsl:template>
     
    <xsl:template name="lignesPagePaire" match="ligne" mode="paire">
      <!-- Mes traitements -->
      <fo:block break-after="page" />
    </xsl:template>
     
     
    <xsl:template name="lignesPageImpaire" match="ligne" mode="Impaire">
      <!-- Mes traitements -->
      <fo:block break-after="page" />
    </xsl:template>
    Mon problème subsiste, mais l'erreur à légèrement changée... à savoir un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    java.lang.OutOfMemoryError
    Exception in thread "main
    J'ai beau augmenter la quantité de mémoire lors de l'exécution de java avec un -Xms et Xmx il "plante" toujours au même nombre de page.
    En étudiant la quantité de mémoire allouée j'ai pu constater que celle-ci augmente sans cesse...
    Comment ce fait il qu'elle ne soit jamais désalouée ?
    Mon algorithme serait-il à revoir ?

    Cdt.

  5. #5
    Rédacteur

    Avatar de Erwy
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2003
    Messages
    4 967
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2003
    Messages : 4 967
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    <xsl:template name="corps">
      <xsl:apply-templates select="//tableau/page" />
    </xsl:template>
     
    <xsl:template  match="page">
      <xsl:apply-templates select="ligne" mode="impaire" />
      <xsl:apply-templates select="ligne" mode="paire" />
    </xsl:template>
     
    <xsl:template  match="ligne" mode="paire">
      <!-- Mes traitements -->
      <fo:block break-after="page" />
    </xsl:template>
     
     
    <xsl:template  match="ligne" mode="Impaire">
      <!-- Mes traitements -->
      <fo:block break-after="page" />
    </xsl:template>
    Si ça ressemblait + à ça ce serait mieux

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 17
    Par défaut
    J'ai fait cette modification,
    il y a du progrès, je n'ai plus de OutOfMemory, par contre visiblement je boucle sans fin. Je suis actuellement à près de 10 minutes de génération et toujours aucun résultat.

    Le principe de la boucle sans fin me plairait bien, seulement pour un nombre de page moins élévé j'arrive à terme de la génération et la boucle est la même.
    J'avoue avoir un peu de difficulté sur la compréhension de cette "histoire"

    -------------
    Trouvé pourquoi ça ne s'arretait pas.
    En fait le <xsl:apply-templates select="ligne" mode="paire" /> n'arrive pas à trouver le <xsl:template match="ligne" mode="paire" /> (respectivement avec impaire)

    si par contre je remet <xsl:apply-templates select="." mode="paire" /> dans ce cas il trouve bien la concordance...

    Mais si je remet avec un select="." il me remange toute la mémoire.
    Je deviens chèvre...

Discussions similaires

  1. XSL-FO avec FOP - Répéter entête sur chaque page
    Par dacid dans le forum XML/XSL et SOAP
    Réponses: 1
    Dernier message: 18/10/2013, 21h17
  2. [XSL-FO][FOP] erreur lors generation Pdf
    Par toMuch dans le forum XSL/XSLT/XPATH
    Réponses: 1
    Dernier message: 20/09/2010, 17h15
  3. [TALEND+FOP] erreur fichier xsl
    Par toMuch dans le forum Développement de jobs
    Réponses: 0
    Dernier message: 31/08/2010, 16h31
  4. [XSL] [debutant] erreur bete avec choose
    Par enigma dans le forum XSL/XSLT/XPATH
    Réponses: 4
    Dernier message: 21/07/2005, 17h58
  5. [XSL]Récupérer erreur de la fonction document() ?
    Par Chips dans le forum XSL/XSLT/XPATH
    Réponses: 6
    Dernier message: 16/05/2005, 18h03

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo