2017-05-30 2 views
0

J'essaie de créer un fichier PDF avec Apache FOP. Beaucoup de choses fonctionnent très bien MAIS je ne peux pas réussir en utilisant des étiquettes imbriquées. Le nom "Doe" n'apparaît pas en caractères gras. merci beaucoupxsl fo avec les balises imbriquées ne fonctionne pas

Voici mes données et le fichier xsl-fo:

données

<?xml version="1.0" encoding="UTF-8"?> 
<patient> 
    <name>Joe <bold>Doe</bold></name> 
</patient> 

Fichier

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.1" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format" exclude-result-prefixes="fo"> 
    <xsl:output method="xml" version="1.0" omit-xml-declaration="no" indent="yes"/> 

    <xsl:template match="patient">  
    <fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format"> 

     <fo:layout-master-set> 
     <fo:simple-page-master master-name="introA4" page-height="29.7cm" page-width="21cm" margin-top="7cm" margin-bottom="2cm" margin-left="2cm" margin-right="2cm"> 
      <fo:region-body/> 
     </fo:simple-page-master> 
     </fo:layout-master-set> 

     <fo:page-sequence master-reference="introA4"> 
     <fo:flow flow-name="xsl-region-body" color="#808285">  

      <fo:block font-size="16pt" space-after="0mm"> 
      <xsl:value-of select="name"/> 
      </fo:block> 

     </fo:flow> 
     </fo:page-sequence> 

    </fo:root> 
    </xsl:template> 

    <xsl:template match="bold"> 
    <fo:inline font-weight="bold" color="red"> 
      <!--xsl:apply-templates select="node()"/--> 
      <!--xsl:apply-templates select="patient/bold"/--> 
      <xsl:apply-templates/> 
      <!--xsl:value-of select="bold"/--> 
    </fo:inline> 
    </xsl:template> 

    <xsl:template match="boldGold"> 
     <fo:inline font-family="OpenSans-ExtraBold" font-weight="bold" color="red"> 
      <xsl:value-of select="boldGold"/> 
     </fo:inline> 
    </xsl:template> 


</xsl:stylesheet> 

Répondre

2

Change:

<xsl:value-of select="name"/> 

à:

<xsl:apply-templates select="name"/> 

Avec xsl:value-of, vous êtes juste la valeur de chaîne de l'élément name. Avec xsl:apply-templates, vous demandez au processeur XSLT de rechercher et d'utiliser le meilleur modèle correspondant aux nœuds que vous avez sélectionnés.

Une autre façon de travailler, il serait de rendre le modèle pour générer le namefo:block:

<xsl:template match="patient">  
    <fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format"> 

    <fo:layout-master-set> 
     <fo:simple-page-master master-name="introA4" 
      page-height="29.7cm" page-width="21cm" 
      margin-top="7cm" margin-bottom="2cm" 
      margin-left="2cm" margin-right="2cm"> 
     <fo:region-body/> 
     </fo:simple-page-master> 
    </fo:layout-master-set> 

    <fo:page-sequence master-reference="introA4"> 
     <fo:flow flow-name="xsl-region-body" color="#808285">  
     <xsl:apply-templates /> 
     </fo:flow> 
    </fo:page-sequence> 
    </fo:root> 
</xsl:template> 

<xsl:template match="name"> 
    <fo:block font-size="16pt" space-after="0mm"> 
    <xsl:apply-templates /> 
    </fo:block> 
</xsl:template> 

<xsl:template match="bold"> 
    <fo:inline font-weight="bold" color="red"> 
    <xsl:apply-templates/> 
    </fo:inline> 
</xsl:template> 
+0

Merci pour votre réponse. Cela fonctionne parfaitement et la solution alternative est géniale. Merci encore! –