Если вы хотите анализировать HTML, вам нужен способ интеграции анализатора HTML, который возможен с процессором XSLT 2, если вы используете реализацию синтаксического анализатора HTML Дэвида Карлайла в XSLT 2 из https://github.com/davidcarlisle/web-xslt/blob/master/htmlparse/htmlparse.xsl,, после чего вы можете импортировать егои вызовите функцию для разбора содержимого элемента section
на узлы, которые будут обрабатываться вашими шаблонами:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:fo="http://www.w3.org/1999/XSL/Format"
xmlns:d="data:,dpc"
exclude-result-prefixes="#all"
version="3.0">
<xsl:import href="https://raw.githubusercontent.com/davidcarlisle/web-xslt/master/htmlparse/htmlparse.xsl"/>
<xsl:output indent="yes"/>
<xsl:template match="/">
<fo:root>
<fo:layout-master-set>
<fo:simple-page-master master-name="first" page-height="29.7cm" page-width="21cm" margin-top="1cm" margin-bottom="2cm" margin-left="2.5cm" margin-right="2.5cm">
<fo:region-body margin-top="1cm"/>
<fo:region-before extent="1cm"/>
<fo:region-after extent="1.5cm"/>
</fo:simple-page-master>
</fo:layout-master-set>
<fo:page-sequence master-reference="first">
<fo:flow flow-name="xsl-region-body">
<fo:block>
<xsl:apply-templates/>
</fo:block>
</fo:flow>
</fo:page-sequence>
</fo:root>
</xsl:template>
<xsl:template match="section">
<fo:block>
<xsl:apply-templates select="d:htmlparse(., '', true())/node()"/>
</fo:block>
</xsl:template>
<xsl:template match="b">
<fo:inline font-weight="bold">
<xsl:apply-templates select="*|text()" />
</fo:inline>
</xsl:template>
<xsl:template match="u">
<fo:inline text-decoration="underline">
<xsl:apply-templates select="*|text()" />
</fo:inline>
</xsl:template>
<xsl:template match="i">
<fo:inline font-style="italic">
<xsl:apply-templates select="*|text()" />
</fo:inline>
</xsl:template>
</xsl:stylesheet>
https://xsltfiddle.liberty -development.net / 94hvTAp
Я использовал ваши шаблоны, как показано в вашем вопросе, но учтите, что вы можете упростить все способы использования <xsl:apply-templates select="*|text()" />
до <xsl:apply-templates/>
в обычном режиме.
Другие способы зависят от конкретного используемого процессора XSLT (т.е.он предлагает расширение, например http://saxonica.com/html/documentation/functions/saxon/parse-html.html или позволяет ли вам реализовать собственные функции расширения, интегрирующие анализатор HTML).
Если HTML представляет собой правильно сформированный XML (например, имеет все необходимые конечные теги ицитирует атрибуты, не использует специфические для HTML ссылки на сущности), затем вы также можете использовать функцию XPath 3.1 parse-xml-fragment
с процессором XSLT 3, таким как Saxon 9.8 или более поздней версии:
<xsl:template match="section">
<fo:block>
<xsl:apply-templates select="parse-xml-fragment(.)/node()"/>
</fo:block>
</xsl:template>
https://xsltfiddle.liberty -development.net / 94hvTAp / 1