/ / Umieść tekst pogrubiony w tekście pogrubionym - xml, xslt, text

Zmień tekst w pogrubiony tag jako pogrubiony - xml, xslt, text

Mam następujący plik 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>

Teraz chcę napisać xslt, który sprawi, że tekst zawarty w tagu będzie pogrubiony.

Pożądane wyjście:

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

Piszę wyjście 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>

Objaśnienie: Muszę uzyskać rekurencyjną metodę przechodzeniaprzez każdy węzeł. A to przejście musi być dynamiczne. Ponieważ w żadnym momencie nie wiem, jaki rodzaj xml dostanę. Na wysokim poziomie znam strukturę węzłów. Mam xsd, który ma wszystkie zdefiniowane węzły i węzły podrzędne, które mogą być obecne w węźle nadrzędnym. Dlatego mój xslt działa w rekurencji, aby sprawdzić, który jest bieżącym węzłem i na tej podstawie muszę zastosować style do niego.

Teraz z powyższym xslt, po napotkaniu znacznika "E", tekst następujący po tagu E nadchodzi dwukrotnie.

Aktualny wynik: To jest przykładowy tekst. Chcę wyświetlić ten tekst pogrubioną czcionką. To jest dobre. pokaż ten tekst pogrubiony.

Zaproponuj mi proszę.

Odpowiedzi:

0 dla odpowiedzi № 1

Zakładając, że masz już arkusz stylów XSLT, który przekształca tekst i nie ma szablonu, który już przetwarza dany węzeł, możesz dodać ten szablon (pasuje do wszystkich wystąpień E z a type atrybut zawierający bold), który zastąpi mecz fo:block zawierający font-weight="bold" atrybut:

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

Jeśli w ogóle nie masz szablonu XSLT, a powyższy tekst jest wszystkim, czego potrzebujesz, możesz użyć tego arkusza stylów, który wygeneruje minimalny plik XSL-FO zawierający żądaną transformację:

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