/ / Vytvorte text zarovnaný tučným písmom ako tučný - xml, xslt, text

Urobte text zarovnané tučným písmom ako tučný - xml, xslt, text

Mám nasledujúci súbor 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 by som chcel písať xslt, ktorý bude text zarovnaný v tagu tučný.

Požadovaný výstup:

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

Píšem výstup 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>

explaination: Musím dosiahnuť rekurzívny spôsob, ako prejsťcez každý uzol. A tento prechod musí byť dynamický. Pretože v každom okamihu neviem, aký druh xml dostanem. Na vysokej úrovni poznám štruktúru uzlov. Mám xsd, ktorý má všetky definované uzly a podradné uzly, ktoré môžu byť prítomné v nadradenom uzle. Preto môj xslt beží v rekurziu, aby zistil, ktorý je aktuálny uzol a na základe toho musím použiť štýly.

Teraz s vyššie uvedeným znakom xslt, akonáhle sa objaví značka "E", text nasledujúci po značke E prichádza dvakrát.

Aktuálny výkon: Toto je ukážkový text. Chcem tento text zobraziť tučným písmom. Toto je dobré. zobraziť tento text tučným písmom.

Navrhnite mi prosím.

odpovede:

0 pre odpoveď č. 1

Za predpokladu, že už máte šablónu štýlov XSLT, ktorá transformuje text a žiadnu šablónu, ktorá už spracováva daný uzol, môžete túto šablónu pridať (zodpovedá všetkým výskytom E s type atribút obsahujúci bold), ktorý nahradí zápas s fo:block obsahujúci a font-weight="bold" atribút:

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

Ak nemáte žiadnu šablónu XSLT a vyššie uvedený text je všetko, čo chcete, môžete použiť tento štýl šablón, ktorý generuje minimálny súbor XSL-FO obsahujúci požadovanú transformáciu:

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