2009-09-19 4 views
3

J'ai un document XML que je transforme avec xslt en un document xsl-fo. J'ai ce problème difficile que j'ai essayé de traquer une solution pendant longtemps ...Transformation XSLT remplaçant une balise qui apparaît périodiquement dans le document

Dans mon XML de source j'ai quelques étiquettes entrecoupées partout. Je veux les mettre en forme comme souligné dans le document résultant, mais je n'ai pas été en mesure de le faire.

J'essaie en utilisant le code comme ceci:

<xsl:template match="//em"> 
    <fo:inline text-decoration="underline"> 
    <xsl:apply-templates select="*|text()"/> 
    </fo:inline> 
</xsl:template> 

Le XSLT complet ressemble à ceci:

<xsl:stylesheet 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:fo="http://www.w3.org/1999/XSL/Format" 
    version="1.0"> 



    <!-- match em tags --> 
    <xsl:template match="//em"> 
    <fo:inline text-decoration="underline"> 
     <xsl:apply-templates select="*|text()"/> 
    </fo:inline> 
    </xsl:template> 
    <xsl:template match="//u"> 
    <fo:inline text-decoration="underline"> 
     <xsl:apply-templates select="*|text()"/> 
    </fo:inline> 
    </xsl:template> 

    <!-- match b tags --> 
    <xsl:template match="//b"> 
    <fo:inline font-weight="bold"> 
     <xsl:apply-templates select="*|text()"/> 
    </fo:inline> 
    </xsl:template> 

    <xsl:template match="//br"> 
    <fo:block><xsl:text>&#xA;</xsl:text></fo:block> 
    </xsl:template> 

    <xsl:template match="briefs"> 
    <fo:root> 
     <fo:layout-master-set> 
     <fo:simple-page-master master-name="Evidence" page-width="8.5in" page-height="11in" margin="1in"> 
      <fo:region-body margin-bottom=".5in" margin-top=".5in" region-name="xsl-region-body" /> 
      <fo:region-before extent="1em" region-name="xsl-region-before" /> 
      <fo:region-after extent="1em" region-name="xsl-region-after" /> 
     </fo:simple-page-master> 
     </fo:layout-master-set> 
     <xsl:for-each select="brief"> 
     <fo:page-sequence master-reference="Evidence"> 
     <fo:static-content flow-name="xsl-region-before" font-family="Times"> 
      <fo:block font-size="10pt" text-align="center" color="#666666"> 
      <fo:inline font-style="italic"><xsl:value-of select="title"/></fo:inline> by <xsl:value-of select="author"/> 
      </fo:block> 
     </fo:static-content> 

     <fo:static-content flow-name="xsl-region-after" font-family="Times" font-size="10pt"> 
      <fo:table> 
      <fo:table-column /> 
      <fo:table-column column-width="1in" /> 
      <fo:table-body> 
       <fo:table-row> 
       <fo:table-cell> 
        <fo:block text-align="left" color="#666"><xsl:value-of select="copyright"/></fo:block> 
       </fo:table-cell> 
       <fo:table-cell> 
        <fo:block text-align="right" font-weight="bold"> 
        Page <fo:page-number/> 
        </fo:block> 
       </fo:table-cell> 
       </fo:table-row> 
      </fo:table-body> 
      </fo:table> 
     </fo:static-content> 

     <fo:flow flow-name="xsl-region-body" font-family="Times"> 
      <fo:block font-size="14pt" text-align="center" text-transform="uppercase" border-before-width="2pt" border-before-color="black" border-before-style="double" border-after-width="1pt" border-after-color="black" border-after-style="solid" background-color="#ccc"> 
      <xsl:value-of select="title"/> 
      </fo:block> 

      <xsl:for-each select="heading"> 
      <xsl:choose> 
       <xsl:when test="@level = 2"> 
       <fo:block font-size="11pt" font-weight="bold" keep-with-next="always" text-transform="uppercase" padding-before="1em"> 
        <xsl:value-of select="title"/></fo:block> 
       </xsl:when> 
       <xsl:when test="@level = 3"> 
       <fo:block font-size="10pt" font-weight="normal" keep-with-next="always" text-transform="uppercase" padding-before="1em"> 
        <xsl:value-of select="title"/></fo:block> 
       </xsl:when> 
       <xsl:otherwise> 
       <fo:block font-size="12pt" font-weight="bold" keep-with-next="always" text-transform="uppercase" padding-before="1em"> 
        <xsl:value-of select="title"/></fo:block> 
       </xsl:otherwise> 
      </xsl:choose> 

      <xsl:for-each select="content/item"> 
       <xsl:choose> 
       <xsl:when test="@type = 'card'"> 
        <!--Print the taglines--> 
        <fo:block font-size="10pt" font-weight="bold" padding-before="1em" keep-with-next="always"> 
        <!--<xsl:number value="position()" format="1" />. --> 
        <xsl:value-of select="tagline"/> 
        </fo:block> 

        <!--Print the citation--> 
        <fo:block font-size="10pt" font-style="italic" keep-with-next="always" keep-together.within-page="always" margin-left=".25in" padding-before=".5em"> 
        <!--<xsl:number value="position()" format="1" />. --> 
        <xsl:value-of select="citation" disable-output-escaping="yes" /> 
        </fo:block> 

        <!--Print the body--> 
        <fo:block font-size="10pt" keep-together.within-page="always" margin-left=".25in" padding-before=".5em"> 
        <!--<xsl:number value="position()" format="1" />. --> 
        <xsl:value-of select="quote" disable-output-escaping="yes" /> 
        </fo:block> 

       </xsl:when> 
       <xsl:otherwise> 
        <fo:block font-size="10pt" padding-before=".5em"><xsl:value-of select="."/></fo:block> 
       </xsl:otherwise> 
       </xsl:choose> 
      </xsl:for-each> 

      </xsl:for-each> 


     </fo:flow> 

     </fo:page-sequence> 
     </xsl:for-each> 
    </fo:root> 
    </xsl:template> 

</xsl:stylesheet> 

Quelqu'un at-il des idées? Merci beaucoup !!!!!

+0

Pouvez-vous poster un échantillon de vos commentaires? – lavinio

Répondre

7

Il n'est pas clair pour moi où votre code doit réellement "aller sauvage" avec le document - c'est-à-dire exécuter les correspondances. Si <briefs> est le nœud racine, alors je m'attendrais à voir quelques <xsl:apply-templates select="*"/> ou similaire à un certain point; sinon vous êtes seulement va obtenir la sortie comme spécifié dans la correspondance de la racine (et il n'appliquera jamais vos correspondances <em> etc).

Si vous voulez traiter le document entier en utilisant uniquement des substitutions lorsqu'elles sont définies, puis le match classique est quelque chose comme:

<xsl:template match="@* | node()"> 
    <xsl:copy> 
     <xsl:apply-templates select="@* | node()"/> 
    </xsl:copy> 
</xsl:template> 

Parce que cela correspond à tous les nœuds, et des cascades, il court pour chaque nœud jusqu'à ce qu'un plus correspondance spécifique est trouvée. Donc, avec l'xslt:

<xsl:template match="@* | node()"> 
    <xsl:copy> 
    <xsl:apply-templates select="@* | node()"/> 
    </xsl:copy> 
</xsl:template> 
<xsl:template match="bar"> 
    <BAR/> 
</xsl:template> 

La plupart des nœuds seront répétés « comme est », mais tous les éléments <bar> seront remplacés par <BAR/> (et sans attributs/contenu).

Notez que même avec ceci; vous devez cascade explicitement si vous attendez que les données enfant soient traitées par des correspondances (comme indiqué par l'exemple <bar> ci-dessus, lequel ne pas en cascade). Et je ne vois pas <xsl:apply-templates> dans votre match <briefs>.

Enfin; le match="//em" est redondant; match="em" devrait suffire.

1

Ne pas voir toute la feuille de style n'aide pas, mais la syntaxe de correspondance doit probablement être match="em" et non match="//em".

+0

Merci pour votre réponse! Oui, j'ai essayé de cette façon aussi et ça n'a pas aidé ... – markwatson

0

Il semble que vous fassiez votre XSLT impérativement au lieu de déclarer. MG est correct, je pense que vous aurez plus de chance si vous faites moins "for-each" -ing et plus "apply-templates" -ing.

Il semble que vous ne correspondiez pas à tous vos nœuds em parce que vous n'appliquez pas les modèles dans votre modèle de racine maître. Je suis tenté de dire que chaque fois que vous avez un for-each, vous devriez probablement utiliser un apply-templates à la place, mais c'est un peu académique.

Questions connexes