Domanda

Recentemente ho cambiato un paio di miei file .xml da DocBook a Dita. La conversione è andato bene, ma ci sono alcuni artefatti indesiderati. Quello che sto perplesso è che il .dita non recongnize il tag <para> da docbook, e lo sostituisce con <p>. Che si potrebbe pensare che sarebbe bene, ma questo fa sì che il XML per mostrare gli elementi in lista ordinata e come essere sulla riga successiva, vale a dire:

1
 item One
2
 item Two

invece che:

1 item One
2 item Two

Allora, come faccio a cambiare questo:

<section>
<title>Cool Stuff</title>
<orderedlist>
  <listitem>
    <para>ItemOne</para>
  </listitem>

  <listitem>
    <para>ItemTwo</para>
  </listitem>
</orderedlist>

a questo:

<section>
<title>Cool Stuff</title>
<orderedlist>
  <listitem>
    ItemOne
  </listitem>

  <listitem>
    ItemTwo
  </listitem>
</orderedlist>

Mi dispiace, avrei dovuto essere più chiaro con la domanda. Ho bisogno di rimuovere tutti i tag dal doument che sono a diversi livelli di profondità, ma seguire sempre la (locale) albero listitem / para. Sono un po 'nuovo a questo, ma potrei potrebbe essere solo facendo male virando sulla mia docbook2dita trasformazione. Può essere in quel posto?

È stato utile?

Soluzione

Vorrei utilizzare questo foglio di stile:

<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>

Nota : regola l'identità di sovrascrittura. listitem/para vengono bypassati (questa conserve contenuto misto)

Altri suggerimenti

È in grado di elaborare i file DITA con XSLT che filtra i nodi <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>

Ho avuto un problema simile, ma sto usando qtdom che non sempre funziona al 100% come le specifiche XSLT 2.x. (Sto pensando di passare alla biblioteca Apache ad un certo punto ...)

ho voluto cambiare il "listitem" equivalente nel mio codice in un div con una classe corrispondente:

<xsl:for-each select="/orderedlist/lisitem">
  <div class="listitem">
    <xsl:apply-templates select="node()"/>
  </div>
</xsl:for-each>

Ciò elimina la listitem e lo sostituisce con

Poi il modello, quello che hai in , nel mio caso, può includere tag, quindi non ho potuto utilizzare gli altri due esempio, che avrebbe trasformato tutto in testo normale. Invece ho usato che:

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

che rimuove i tag "para", ma mantiene tutti i bambini come è. Così paragrafi possono includere la formattazione ed è conservato attraverso l'elaborazione di XSLT.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top