Pregunta

Me cambió recientemente un par de mis archivos .xml de DocBook a dita. La conversión fue bien, pero hay algunos efectos no deseados. El que estoy confundido en .dita es que no recongnize la etiqueta <para> de docbook, y lo reemplaza con <p>. ¿Qué se podría pensar que estaría bien, pero esto hace que el XML para mostrar los elementos de lista ordenada y como en la siguiente línea, es decir:

1
 item One
2
 item Two

en lugar de:

1 item One
2 item Two

Entonces, ¿cómo puedo cambiar esto:

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

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

a esto:

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

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

Lo siento, debería haber sido más claro con la pregunta. Necesito quitar todas las etiquetas de la doument que están en diferentes niveles de profundidad, pero siempre seguir el (local) listitem árbol de / para. Soy un poco nuevo en esto, pero podría simplemente podría estar haciendo mal virando en mi transformación a docbook2dita. ¿Puede ser en ese lugar?

¿Fue útil?

Solución

Yo usaría esta hoja de estilo:

<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: : regla de la identidad de sobrescritura. listitem/para se omiten (Esto preserva contenido mixto)

Otros consejos

Puede procesar los archivos dita con un XSLT que filtra los nodos <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>

He tenido un problema similar, pero estoy usando QtDom que no siempre funciona al 100% como las especificaciones XSLT 2.x. (Estoy pensando en cambiar a la biblioteca Apache en algún momento ...)

Yo quería cambiar el "listitem" equivalente en mi código en un div con una clase correspondiente:

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

Esto elimina la listitem y lo sustituye por

A continuación, la plantilla, lo que tiene en , en mi caso, puede incluir etiquetas, por lo que no podía usar los otros dos ejemplo que transformaría todo en texto plano. En su lugar he usado:

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

Esto elimina las etiquetas "para", pero mantiene todos los niños como se muestran. Así párrafos pueden incluir el formato y se conserva a través del procesamiento de XSLT.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top