2 votes

Utilisation de la balise <br /> dans le XML pour XSLT

Je rencontre actuellement des difficultés avec une conversion XML/XSLT vers HTML sur laquelle je travaille. En bref, je veux utiliser <br /> à l'intérieur d'une balise XML, afin que le fichier HTML après transformation affiche un saut de ligne. Après quelques essais, j'ai réussi à faire en sorte que cela fonctionne, mais au détriment de certaines autres fonctionnalités. A savoir la possibilité de mettre en évidence des parties.

Tout d'abord, le fichier XML déversé. En gros, il y a plusieurs balises possibles qui contiennent toutes un nom et un prénom. Dans ce cas, je veux que le prénom et le nom soient analysés sur une ligne séparée (d'où l'utilisation de la balise <br /> tag). En outre, dans certains cas, le prénom ou le nom de famille devra être mis en évidence. Dans ce cas, à la ligne 3, le nom de famille "The Hand".

<swift_native>
<tag tag_code=":1:"><![CDATA[Jaco<br />Ronnie]]></tag>
<tag tag_code=":2:"><![CDATA[John<br />Doe]]></tag>
<tag tag_code=":2:"><![CDATA[Robbie<br />]]><highlight>The Hand</highlight></tag>
</swift_native>

Jusqu'à présent, en fonction de la méthode que j'utilise dans le XSLT, je parviens à obtenir soit les sauts de ligne corrects, soit la mise en évidence. Mais pas les deux : La figure suivante le montre.

output Ci-dessous vous voyez le fichier XSLT utilisé. Où vous pouvez voir que l'utilisation de <xsl:apply-templates/> fera fonctionner la mise en évidence et <xsl:value-of select="." disable-output-escaping="yes"/> me permettra d'utiliser le <br /> correctement.

<?xml version="1.0"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<!-- HTML Layout definition -->
<xsl:output method="html"/>
<xsl:template match="swift_native">

    <html>
        <head>
            <title>
                <xsl:apply-templates select="message_id"/>
            </title>
            <style type="text/css">
                #tbl1,#tbl2 {display:none;}
                #lnk1,#lnk2   {border:none;background:none;width:85px;}
                td {FONT-SIZE: 75%; MARGIN: 0px; COLOR: #000000;}
                td {FONT-FAMILY: verdana,helvetica,arial,sans-serif}
                a {TEXT-DECORATION: none;}
                table.subtable {border-collapse:collapse;}
                table.subtable td {border:1px solid black;}
            </style>
        </head>
        <body>
            <table cellpadding="3" width="100%" class="subtable">
                <tr bgcolor="#cccccc">
                    <td colspan="3">Block4</td>
                </tr>
                <xsl:apply-templates select="tag" />
            </table>
        </body>
    </html>
</xsl:template>

<!-- Variable definition -->

<xsl:template match="tag">
    <tr>
        <td>
            <b>
                <xsl:value-of select="@tag_code" />
            </b>
        </td>
        <td>
            <xsl:value-of select="." disable-output-escaping="yes"/>
        </td>
        <td>
            <xsl:apply-templates/>
        </td>
    </tr>
</xsl:template>

<xsl:template match="highlight">
    <span style="background-color:yellow;">
        <xsl:apply-templates/>
    </span>
</xsl:template>

</xsl:stylesheet>

Évidemment, la question est la suivante : est-ce que quelqu'un connaît un moyen d'utiliser à la fois la fonction <br /> et la mise en évidence ?

2voto

harpo Points 17399

CDATA indique au processeur d'interpréter le contenu comme du texte brut, et non comme du balisage. C'est pourquoi disable-output-escaping est nécessaire pour éviter que le <br/> d'apparaître comme &lt;br/&gt; .

Si vous voulez profiter de disable-output-escaping vous devrez modifier la façon dont vous sélectionnez le contenu des balises.

Ajouter un modèle

<xsl:template match="tag/text()">
    <xsl:value-of select="." disable-output-escaping="yes"/>
</xsl:template>

et changer le value-of ligne vers

<xsl:apply-templates select="text()|*"/>

1voto

JLRishe Points 22173

Une solution consiste à utiliser les deux :

<xsl:template match="tag">
    <tr>
        <td>
            <b>
                <xsl:value-of select="@tag_code" />
            </b>
        </td>
        <td>
            <xsl:apply-templates/>
        </td>
    </tr>
</xsl:template>

<xsl:template match="tag//text()">
    <xsl:value-of select="." disable-output-escaping="yes" />
</xsl:template>

<xsl:template match="highlight">
    <span style="background-color:yellow;">
        <xsl:apply-templates />
    </span>
</xsl:template>

Notez toutefois que si vous procédez ainsi, vous devez vous assurer que toutes les valeurs de texte dans le champ <tag> sont correctement échappés dans le CDATA, et doublement échappé à l'extérieur, c'est-à-dire plutôt que

<tag tag_code=":2:"><![CDATA[Robbie & Bobbie <br />]]><highlight> &amp; The Hand</highlight></tag>

Vous devez avoir :

<tag tag_code=":2:"><![CDATA[Robbie &amp; Bobbie<br />]]><highlight> &amp;amp; The Hand</highlight></tag>

Donc, ce n'est probablement pas une bonne approche si le <tag> n'ont aucune possibilité de contenir des caractères spéciaux XML.

Si vous pouvez faire en sorte que le texte situé directement en dessous de l'icône <tag> se toujours soit dans un CDATA et que tout ce qui se trouve dans les nœuds inférieurs (par exemple <highlight> ) ne le fera pas, alors c'est un peu plus simple. Vous pouvez remplacer le modèle de correspondance de texte ci-dessus par celui-ci :

<xsl:template match="tag/text()">
    <xsl:value-of select="." disable-output-escaping="yes" />
</xsl:template>

Il suffit ensuite de s'assurer que le contenu des CDATA est correctement échappé et que tout le reste est simplement du XML valide.

Enfin, si vous avez un certain contrôle sur vos données sources, vous devriez envisager d'abandonner les CDATA et de n'avoir que le fichier <br /> en plein dans le <tag> :

<tag tag_code=":2:">Robbie<br /><highlight>The Hand</highlight></tag>

Vous pourriez alors utiliser cette XSL, qui est bien plus robuste que tout ce qui utilise disable-output-escaping :

<xsl:template match="tag">
    <tr>
        <td>
            <b>
                <xsl:value-of select="@tag_code" />
            </b>
        </td>
        <td>
            <xsl:apply-templates/>
        </td>
    </tr>
</xsl:template>

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

<xsl:template match="highlight">
    <span style="background-color:yellow;">
        <xsl:apply-templates />
    </span>
</xsl:template>

1voto

user508402 Points 316

Heureusement, il existe aussi une solution simple. Il suffit d'ajouter cette ligne à votre fichier xsl :

<xsl:template match="br"><br/></xsl:template>  

De cette façon, il n'est pas nécessaire d'envelopper les données dans des CDATA, mais plutôt d'utiliser la méthode beaucoup plus intuitive :

<tag tag_code=":1:">Jaco<br/>Ronnie</tag>

De même, d'autres balises HTML simples et courantes peuvent être incluses. Voici un exemple de lien entre le gras, l'italique, etc. et les styles CSS, mais une simple phrase pour chaque style (comme ci-dessus) peut également fonctionner :

<xsl:template match="i|b|u|strong">
    <span>
        <xsl:attribute name="class">html_<xsl:value-of select="name(.)" /></xsl:attribute>
        <xsl:apply-templates />
    </span>
</xsl:template>

Si vous vous retrouvez à faire cela souvent, copiez-les tous dans html.xsl et utilisez xsl:include pour les utiliser en cas de besoin.

-2voto

Amirouche Zeggagh Points 1213

Si vous voulez faire en html est

tout ce dont vous avez besoin est de faire en XLS :

<br></br>

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X