XSL: Rimozione di tag XML, ma mantenendo il loro contenuto
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?
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 ??strong>: 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
<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.