Je voudrais m'excuser pour le mauvais titre - je ne savais vraiment pas comment l'exprimer mieux. Je travaille actuellement sur un script XSLT 1.0 (en utilisant xsltproc) qui transforme un simple format XML en une représentation de texte adaptée à la consommation par un générateur PDF. Dans mon format XML, il n'y a que trois éléments: <book>
, <chapter>
et <section>
. Cependant, en raison d'une caractéristique désagréable de la DTD, j'ai du mal à écrire un script XSLT approprié pour transformer le document. Voici la DTD qui décrit leur relation:Comment puis-je faire en sorte que mon modèle XSLT gère les éléments parents manquants?
<!ELEMENT book ((chapter|section)*)>
<!ELEMENT chapter (section*)>
<!ELEMENT section (#PCDATA)>
Voici la ma feuille de style XSLT qui effectue la traduction:
<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" encoding="iso-8859-1"/>
<xsl:strip-space elements="*"/>
<xsl:template match="section">
<xsl:if test="not(preceding-sibling::section)">@BeginSections
</xsl:if>
<xsl:text>@Section @Begin
</xsl:text>
<xsl:apply-templates/>
<xsl:text>@End @Section
</xsl:text>
<xsl:if test="not(following-sibling::section)">@EndSections
</xsl:if>
</xsl:template>
<xsl:template match="chapter">
<xsl:if test="not(preceding-sibling::chapter)">@BeginChapters
</xsl:if>
<xsl:text>@Chapter @Begin
</xsl:text>
<xsl:apply-templates/>
<xsl:text>@End @Chapter
</xsl:text>
<xsl:if test="not(following-sibling::chapter)">@EndChapters
</xsl:if>
</xsl:template>
<xsl:template match="/book">
<xsl:text>@Book @Begin
</xsl:text>
<xsl:apply-templates/>
<xsl:text>@End @Book
</xsl:text>
</xsl:template>
</xsl:stylesheet>
Maintenant, voici la partie délicate et ma question: la DTD permet d'avoir <section>
comme les enfants directs de <book>
. Cependant, je dois encore donner la même sortie que si cet élément /book/section
était réellement /book/chapter/section
.
Ainsi par exemple: <book><section/><chapter/></book>
devient (je dentelées la sortie pour une meilleure lisibilité)
@Book @Begin
@BeginChapters
@Chapter @Begin
@BeginSections
@Section @Begin
@End @Section
@EndSections
@End @Chapter
@Chapter @Begin
@End @Chapter
@EndChapters
@End @Book
Donc ce que je voudrais faire est d'ajuster mon script XSLT de sorte que le modèle « section » appelle en quelque sorte aussi modèle 'chapter' dans le cas où l'élément donné <section>
ne se trouve pas dans <chapter>
. Comment pourrais-je faire ça?
Pour ce que ça vaut, voici un autre exemple. Plusieurs éléments <section>
qui ne sont pas déjà dans un <chapter>
doivent être fusionnés en un. Par conséquent, <book><section/><section/><section/><chapter/><section/></book>
produit une sortie pour trois chapitres (le premier a trois sections, le second n'en a pas, le troisième a une section).
Impossible d'utiliser une forme de, utilisez maths soit chapitre soit section. Après avoir apparié l'un d'entre eux, continuez à faire correspondre une ou plusieurs sections –
frayser