/ / Haga el texto encerrado en negrita como negrita - xml, xslt, texto

Haga que el texto encerrado en negrita sea negrita: xml, xslt, text

Tengo el siguiente archivo 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>

Ahora quiero escribir un xslt que haga que el texto encerrado dentro de la etiqueta aparezca en negrita.

Salida deseada:

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

Estoy escribiendo salida 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>

Explicacion Tengo que conseguir un método recursivo para atravesar.a través de cada nodo. Y este recorrido tiene que ser dinámico. Porque en cualquier momento no sé qué tipo de xml obtendré. En un nivel alto, conozco la estructura de los nodos. Tengo el xsd que tiene todos los nodos definidos y los nodos secundarios que pueden estar presentes en el nodo principal. Por lo tanto, mi xslt se ejecuta en forma recursiva para verificar cuál es el nodo actual y, en base a eso, necesito aplicarle estilos.

Ahora, con el xslt anterior, una vez que se encuentra la etiqueta "E", el texto que sigue a la etiqueta E viene dos veces.

Salida de corriente: Este es un texto de ejemplo. Quiero mostrar este texto en negrita. Esto es bueno. mostrar este texto en negrita

Sugiéreme por favor

Respuestas

0 para la respuesta № 1

Suponiendo que ya tiene una hoja de estilo XSLT que está transformando el texto y no una plantilla que ya procesa ese nodo específico, puede agregar esta plantilla (coincide con todas las apariciones de E con un type atributo que contiene bold) que reemplazará el partido con fo:block que contiene un font-weight="bold" atributo:

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

Si no tiene ninguna plantilla XSLT y el texto de arriba es todo lo que desea, entonces puede usar esta hoja de estilo que generará un archivo XSL-FO mínimo que contiene la transformación que desea:

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