2011-08-12 8 views
8

Tworzę plik xslt, który powinien przekonwertować mój xml na xsl-fo.Używanie XSLT do tworzenia XSL-FO z zagnieżdżonymi znacznikami pogrubienia/kursywy

XML jest coś takiego:

<doc> 
    <par> 
    <point> 
     <text>some text</text> 
    </point> 
    </par> 
</doc> 

Oczywiście, istnieje wiele ustępy i punkty w dokumencie. Chciałbym dodać możliwość formacie "tekst", na przykład

<bold>bolded text</bold> and <italic>italic</italic> 

powinien dać

<fo:block><fo:inline font-weight="bold">bolded text</fo:inline> and <fo:inline font-style="italic">italic</fo:inline> 

Teraz mam dość prosty dokument XSLT, tak:

<xsl:stylesheet version="1.1" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format" exclude-result-prefixes="fo"> 
    <xsl:output method="xml" version="1.0" omit-xml-declaration="no" indent="yes"/> 
    <xsl:param name="versionParam" select="'1.0'"/> 
    <xsl:template match="doc"> 
    <fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format"> 
     <fo:layout-master-set> 
     <fo:simple-page-master master-name="simpleA4" page-height="29.7cm" page-width="21cm" margin-top="2cm" margin-bottom="2cm" margin-left="2cm" margin-right="2cm"> 
      <fo:region-body margin="2cm"/> 
      <fo:region-before margin="0.2cm" extent="1.5cm"/> 
     </fo:simple-page-master> 
     </fo:layout-master-set> 
     <fo:page-sequence master-reference="simpleA4"> 
     <fo:static-content flow-name="xsl-region-before" margin-right="1cm"> 
      <fo:block text-align="start" margin-top="0.2cm"> 
      <fo:block text-align="end" margin-top="0.2cm"> 
       Page <fo:page-number/> of <fo:page-number-citation ref-id="terminator"/> 
      </fo:block> 
     </fo:static-content> 
     <fo:flow flow-name="xsl-region-body"> 
      <xsl:apply-templates select="par/point"/> 
      <fo:block id="terminator"/> 
     </fo:flow> 
     </fo:page-sequence> 
    </fo:root> 
    </xsl:template> 
    <xsl:template match="point"> 
    <fo:block font-size="16pt" space-after="5mm"> 
     <xsl:value-of select="tresc"/> 
    </fo:block> 
    </xsl:template> 
</xsl:stylesheet> 

Gdyby Dodaję kolejny szablon (pogrubiony, kursywa)? Jak mam to nazwać w węźle "tekstowym"?

znalazłem jakieś rozwiązanie:

<xsl:template match="//bold"> 
    <fo:inline font-weight="bold"> 
     <xsl:value-of select="current()"></xsl:value-of> 
    </fo:inline> 
</xsl:template> 

Ale to nie dla mnie. Wyjście xsl-fo nie zawiera żadnego fo: inline.

Odpowiedz

9

Spójrz na ten przykład. To wyraźnie pokazuje, jak hanlde inline węzłów.

[XSLT 1.0]

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:fo="http://www.w3.org/1999/XSL/Format"> 
    <xsl:output indent="yes"/> 

    <xsl:template match="doc"> 
     <fo:root> 
      <fo:page-sequence> 
       <fo:flow> 
        <xsl:apply-templates select="par/point"/> 
       </fo:flow> 
      </fo:page-sequence> 
     </fo:root> 
    </xsl:template> 

    <xsl:template match="point"> 
     <fo:block font-size="16pt" space-after="5mm"> 
      <xsl:apply-templates select="node()"/> 
     </fo:block> 
    </xsl:template> 

    <xsl:template match="bold"> 
     <fo:inline font-weight="bold"> 
      <xsl:apply-templates select="node()"/> 
     </fo:inline> 
    </xsl:template> 

    <xsl:template match="italic"> 
     <fo:inline font-style="italic"> 
      <xsl:apply-templates select="node()"/> 
     </fo:inline> 
    </xsl:template> 

</xsl:stylesheet> 

podać:

<doc> 
    <par> 
     <point> 
      <text>some <bold>bold</bold></text> 
     </point> 
    </par> 
    <par> 
     <point> 
      <text>some <italic>italic <bold>bolded</bold></italic></text> 
     </point> 
    </par> 
</doc> 

sporządza:

<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format"> 
    <fo:page-sequence> 
     <fo:flow> 
     <fo:block font-size="16pt" space-after="5mm"> 
      some <fo:inline font-weight="bold">bold</fo:inline> 
       </fo:block> 
     <fo:block font-size="16pt" space-after="5mm"> 
      some <fo:inline font-style="italic">italic <fo:inline font-weight="bold">bolded</fo:inline> 
      </fo:inline> 
       </fo:block> 
     </fo:flow> 
    </fo:page-sequence> 
</fo:root> 
+0

'wybrać = "węzeł()"' są zbędne. Od http://www.w3.org/TR/xslt#section-Applying-Template-Rules: "W przypadku braku atrybutu' select', instrukcja 'xsl: apply-templates' przetwarza wszystkie dzieci bieżący węzeł, w tym węzły tekstowe. " –

Powiązane problemy