XSL: suppression de balises xml mais en gardant leur contenu
Question
J'ai récemment changé deux de mes fichiers .xml de DocBook vers DITA. La conversion est bien passé, mais il y a quelques artefacts indésirables. Celui que je suis perplexe sur est que .dita ne recongnize pas la balise <para>
de DocBook, et le remplace par <p>
. Ce qui vous penseriez serait bien, mais cela provoque le XML pour afficher les éléments dans l'ordre et la liste comme étant sur la ligne suivante, i.e.:
1 item One 2 item Two
au lieu de:
1 item One 2 item Two
Alors, comment puis-je changer ceci:
<section>
<title>Cool Stuff</title>
<orderedlist>
<listitem>
<para>ItemOne</para>
</listitem>
<listitem>
<para>ItemTwo</para>
</listitem>
</orderedlist>
à ceci:
<section>
<title>Cool Stuff</title>
<orderedlist>
<listitem>
ItemOne
</listitem>
<listitem>
ItemTwo
</listitem>
</orderedlist>
Je suis désolé, j'aurais été plus clair avec la question. Je dois enlever tous les tags du doument qui sont à différents niveaux de profondeur, mais toujours suivre le (local) arbre listitem / para. Je suis un peu nouveau à cela, mais pourrais-je pouvais être le faire mal en clouant à ma transformation docbook2dita. Peut-il être à cet endroit?
La solution
J'utiliser cette feuille de style:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match ="listitem/para">
<xsl:apply-templates/>
</xsl:template>
</xsl:stylesheet>
Remarque : Ecraser règle d'identité. listitem/para
sont contournés (ce conserve un contenu mixte)
Autres conseils
Vous pouvez traiter les fichiers DITA avec un XSLT qui filtre les nœuds <para>
:
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<!-- copy elements and attributes -->
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
<!-- replace para nodes within an orderedlist with their content -->
<xsl:template match ="orderedlist/listitem/para">
<xsl:value-of select="."/>
</xsl:template>
</xsl:stylesheet>
J'ai eu un problème similaire, mais je suis utilise qtdom qui ne fonctionne pas toujours à 100% comme les spécifications 2.x XSLT. (Je pense à passer à la bibliothèque Apache à un moment donné ...)
Je voulais changer le « listitem » équivalent dans mon code dans un div avec une classe correspondant:
<xsl:for-each select="/orderedlist/lisitem">
<div class="listitem">
<xsl:apply-templates select="node()"/>
</div>
</xsl:for-each>
Cela supprime le listitem et le remplace par
Ensuite, le modèle, ce que vous avez dans
<xsl:template match ="para">
<xsl:copy-of select="node()"/>
</xsl:template>
Cela supprime les balises « para », mais conserve tous les enfants est. Ainsi, les paragraphes peuvent inclure le formatage et il est conservé à travers le traitement XSLT.