/ / Rendi il testo racchiuso in grassetto come grassetto - xml, xslt, testo

Rendi il testo racchiuso in grassetto come grassetto - xml, xslt, testo

Ho il seguente file XML.

<xml>
<chapter>
<p>
<L-1>
This is a sample text. I want to <E type="bold">display this text in bold.<E> This is good.
</L-1>
</p>
<figure>
</figure>
</chapter>
</xml>

Ora voglio scrivere un xslt che renderà il testo racchiuso tra i tag in grassetto.

Output desiderato:

This is a sample text. I want to **display this text in bold.** This is good.

Sto scrivendo l'output di xsl-fo. XSLT

<xml>
<xsl:template match="node()" mode="chapter">
<xsl:for-each select="node()">
<xsl:if test="current()[name() = "P"]">
<xsl:apply-templates select="current()[name() = "P"]"
mode="p" />
</xsl:if>
</xsl:for-each>
</xsl:template>
<xsl:template match="node()[name() = "P"]" mode="p">
<xsl:if test="current()/node()[name() = "L-1"]">
<xsl:apply-templates select="current()/node()[name() = "L-1"]"
mode="l1" />
</xsl:if>
</xsl:template>

<xsl:template match="node()[name() = "L-1"]" mode="l1">
<fo:block>
<xsl:value-of select="current()" />
</fo:block>
<xsl:if test="current()/node()[name() = "E"]">
<xsl:apply-templates select="current()/node()[name() = "E"]"
mode="e" />
</xsl:template>

<xsl:template match="node()[name() = "E"]" mode="e">
<fo:block font-weight="bold">
<xsl:value-of select="current()" />
</fo:block>
</xsl:template>
</xml>

spiegazione: Devo raggiungere un metodo ricorsivo per attraversareattraverso ogni nodo. E questa traversata deve essere dinamica. Perché in qualsiasi momento non so che tipo di xml otterrò. Ad alto livello, conosco la struttura dei nodi. Ho il xsd che ha tutti i nodi definiti e i nodi figli che possono essere presenti nel nodo genitore. Quindi il mio xslt gira in ricorsione per verificare quale sia il nodo corrente e in base a ciò ho bisogno di applicare degli stili ad esso.

Ora con il precedente xslt, una volta che si incontra il tag "E", il testo che segue il tag E arriva due volte.

Uscita corrente: Questo è un testo di esempio. Voglio mostrare questo testo in grassetto. Questo è buono. mostra questo testo in grassetto.

Suggeriscimi per favore

risposte:

0 per risposta № 1

Supponendo che tu abbia già un foglio di stile XSLT che sta trasformando il testo e nessun modello che già elabora quel nodo specifico, puoi aggiungere questo modello (corrisponde a tutte le occorrenze di E con un type attributo contenente bold) che sostituirà la partita con fo:block contenente a font-weight="bold" attributo:

<xsl:template match="E[@type="bold"]">
<fo:block font-weight="bold"><xsl:value-of select="."/></fo:block>
</xsl:template>

Se non hai alcun modello XSLT e il testo sopra è tutto ciò che desideri, puoi usare questo foglio di stile che genererà un file XSL-FO minimo contenente la trasformazione che desideri:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:fo="http://www.w3.org/1999/XSL/XMLFormat"
version="1.0">
<xsl:strip-space elements="*"/>
<xsl:output indent="yes"/>
<xsl:template match="/">
<fo:root>
<fo:layout-master-set>
<fo:simple-page-master master-name="p1"> <fo:region-body/>
</fo:simple-page-master>
</fo:layout-master-set>
<fo:page-sequence master-name="p1">
<fo:flow flow-name="xsl-region-body">
<xsl:apply-templates/>
</fo:flow>
</fo:page-sequence>
</fo:root>
</xsl:template>

<xsl:template match="E[@type="bold"]">
<fo:block font-weight="bold"><xsl:value-of select="."/></fo:block>
</xsl:template>

</xsl:stylesheet>