2010-10-12 5 views
1

J'ai récemment modifié deux fichiers .xml de docbook en dita. La conversion s'est bien passée, mais il y a quelques artefacts indésirables. Celui que je suis perplexe est que .dita ne reconnait 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, à savoir:XSL: Suppression des balises xml mais conservation de leur contenu

 
1 
item One 
2 
item Two 

au lieu de:

 
1 item One 
2 item Two 

alors comment faire je change 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é, je aurais dû être plus claire à la question. Je dois enlever toutes les étiquettes du document qui sont à des niveaux de profondeur variables, mais toujours suivre la liste (locale) de l'arbre/para. Je suis un peu nouveau à ce sujet, mais pourrais-je juste faire mal en le virant sur ma transformation de docbook2dita. Peut-il être à cet endroit?

Répondre

5

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 (ceci préserve le contenu mélangé)

3

Vous pouvez traiter les fichiers DITA avec un XSLT qui filtre les <para> nœuds:

<?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> 
+0

Je suis désolé, j'aurais dû être plus clair avec la question. Je dois enlever toutes les étiquettes du document qui sont à différents niveaux de profondeur, mais toujours suivre la liste de commande (locale) de l'arbre/listitem/para. Je suis un peu nouveau à ce sujet, mais pourrais-je juste faire mal en le virant sur ma transformation de docbook2dita. Peut-il être à cet endroit? – Ace

0

J'ai eu un problème similaire mais j'utilise QtDom qui ne fonctionne pas toujours à 100% comme les spécifications XSLT 2.x. (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 correspondante:

<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 < div class = « listitem » >

Ensuite, le modèle, ce que vous avez à <par>, dans mon cas, peut inclure des balises, donc je ne pouvais pas utiliser les deux autres exemple qui transformerait tout en texte clair. Au lieu de cela j'ai utilisé cela:

<xsl:template match ="para"> 
    <xsl:copy-of select="node()"/> 
</xsl:template> 

Cela supprime les balises "para", mais conserve tous les enfants tels quels. Ainsi, les paragraphes peuvent inclure la mise en forme et sont conservés dans le traitement XSLT.