Как сделать соответствие xsl-шаблона для строки html - PullRequest
0 голосов
/ 30 декабря 2018

У меня есть сценарий, в котором мне нужно визуализировать HTML в PDF, используя XSLT.У меня есть некоторые HTML-содержимое в XML-файле, как

<section>
&lt;p&gt;&lt;b&gt;&lt;u&gt;Heelo&lt;/u&gt;&lt;/b&gt;&lt;/p&gt;
</section>

Мне нужно сделать это в формате PDF.

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

Но это соответствие шаблона не работает.Как этого добиться или есть ли способ заменить as> при создании xml в java?

Заранее спасибо за помощь !!!

1 Ответ

0 голосов
/ 30 декабря 2018

Если вы хотите анализировать 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

...