2014-11-05 1 views
2

Я искал все утро для ответа на этот вопрос, не повезло. Может быть, я просто неправильно искал, я не знаю. Я отображения XML-разметки в формате PDF, используя следующий набор тегов:XSL-FO сделать текст разного цвета в одном элементе

<verbatimText>&lt;para>&lt;quantity> 
&lt;quantityGroup quantityUnitOfMeasure="ft.lbf">&lt;quantityValue>10&lt;/quantityValue> 
&lt;quantityTolerance quantityToleranceType="plusorminus" quantityUnitOfMeasure="ft.lbf"> 2&lt;/quantityTolerance>&lt;/quantityGroup> 
&lt;/quantity>.&lt;/para></verbatimText> 

У меня нет вопроса, отображающее это как все BOLD, одного цветового блока в формате PDF. То, что я хочу попытаться сделать, - это сделать синтаксис XML цветным, как подсветка синтаксиса в текстовом редакторе, где имена элементов будут синими, красными атрибутами и содержанием элементов черными.

Я думаю, что есть способ форматировать подстроки текста, но у меня проблемы с поиском хорошей стартовой точки на этом.

+0

возможность использовать XSLT 2.0 Вы? –

+0

Нет, я запускаю XSL-преобразование через FOP, который, как я знал, не поддерживал 2.0. – twfurst

+0

Есть ли причина, по которой вы не можете отделить преобразование xslt от обработки fo? –

ответ

2

Вот пример того, как вы можете использовать XSLT 2.0 (xsl:analyze-string), чтобы добавить цвет.

Он мог бы использовать некоторые настройки, но показывает, что я имел в виду ...

XML Input

<verbatimText>&lt;para>&lt;quantity> 
&lt;quantityGroup quantityUnitOfMeasure="ft.lbf">&lt;quantityValue>10&lt;/quantityValue> 
&lt;quantityTolerance quantityToleranceType="plusorminus" quantityUnitOfMeasure="ft.lbf"> 2&lt;/quantityTolerance>&lt;/quantityGroup> 
&lt;/quantity>.&lt;/para></verbatimText> 

XSLT 2,0

<xsl:stylesheet version="2.0" xmlns:fo="http://www.w3.org/1999/XSL/Format" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output indent="yes"/> 
    <xsl:strip-space elements="*"/> 

    <xsl:template match="@*|node()"> 
     <xsl:copy> 
      <xsl:apply-templates select="@*|node()"/> 
     </xsl:copy> 
    </xsl:template> 

    <xsl:template match="/"> 
     <fo:root> 
      <fo:layout-master-set> 
       <fo:simple-page-master master-name="my-page" page-width="8.5in" page-height="11in"> 
        <fo:region-body margin="1in" margin-top="1.5in" margin-bottom="1.5in"/> 
       </fo:simple-page-master> 
      </fo:layout-master-set> 
      <fo:page-sequence master-reference="my-page"> 
       <fo:flow flow-name="xsl-region-body"> 
        <xsl:apply-templates/> 
       </fo:flow> 
      </fo:page-sequence> 
     </fo:root> 
    </xsl:template> 

    <xsl:template match="verbatimText"> 
     <fo:block> 
      <xsl:analyze-string select="." regex="(&lt;/?)([^\s>]+)(>?)"> 
       <xsl:matching-substring> 
        <fo:inline color="#0000FF"><xsl:value-of select="concat(regex-group(1),'&#xFEFF;',regex-group(2), 
         if (regex-group(3)) then '&#xFEFF;>' else '')"/></fo:inline> 
       </xsl:matching-substring> 
       <xsl:non-matching-substring> 
        <xsl:analyze-string select="." regex="(\s)([^=&lt;]+=['&quot;])([^'&quot;]+)(['&quot;])(>?)"> 
         <xsl:matching-substring> 
          <xsl:value-of select="regex-group(1)"/> 
          <fo:inline color="#FF0000"><xsl:value-of select="regex-group(2)"/></fo:inline> 
          <xsl:value-of select="regex-group(3)"/> 
          <fo:inline color="#FF0000"><xsl:value-of select="concat(regex-group(4), 
           if (regex-group(5)) then '&#xFEFF;>' else '')"/></fo:inline> 
         </xsl:matching-substring> 
         <xsl:non-matching-substring> 
          <xsl:value-of select="."/> 
         </xsl:non-matching-substring> 
        </xsl:analyze-string> 
       </xsl:non-matching-substring> 
      </xsl:analyze-string>        
     </fo:block> 
    </xsl:template> 

</xsl:stylesheet> 

XSL-FO (С использованием Saxon-HE 9.5)

<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format"> 
    <fo:layout-master-set> 
     <fo:simple-page-master master-name="my-page" page-width="8.5in" page-height="11in"> 
     <fo:region-body margin="1in" margin-top="1.5in" margin-bottom="1.5in"/> 
     </fo:simple-page-master> 
    </fo:layout-master-set> 
    <fo:page-sequence master-reference="my-page"> 
     <fo:flow flow-name="xsl-region-body"> 
     <fo:block> 
      <fo:inline color="#0000FF">&lt;para&gt;</fo:inline> 
      <fo:inline color="#0000FF">&lt;quantity&gt;</fo:inline> 
      <fo:inline color="#0000FF">&lt;quantityGroup</fo:inline> 
      <fo:inline color="#FF0000">quantityUnitOfMeasure="</fo:inline>ft.lbf<fo:inline color="#FF0000">"&gt;</fo:inline> 
      <fo:inline color="#0000FF">&lt;quantityValue&gt;</fo:inline>10<fo:inline color="#0000FF">&lt;/quantityValue&gt;</fo:inline> 
      <fo:inline color="#0000FF">&lt;quantityTolerance</fo:inline> 
      <fo:inline color="#FF0000">quantityToleranceType="</fo:inline>plusorminus<fo:inline color="#FF0000">"</fo:inline> 
      <fo:inline color="#FF0000">quantityUnitOfMeasure="</fo:inline>ft.lbf<fo:inline color="#FF0000">"&gt;</fo:inline> 2<fo:inline color="#0000FF">&lt;/quantityTolerance&gt;</fo:inline> 
      <fo:inline color="#0000FF">&lt;/quantityGroup&gt;</fo:inline> 
      <fo:inline color="#0000FF">&lt;/quantity&gt;</fo:inline>.<fo:inline color="#0000FF">&lt;/para&gt;</fo:inline> 
     </fo:block> 
     </fo:flow> 
    </fo:page-sequence> 
</fo:root> 

PDF Выход (Использование FOP 1,1)

enter image description here

+0

Это потрясающе. Мне нужно было почистить мое регулярное выражение, чтобы полностью понять фильтры, которые вы использовали (вроде бы стыдно сказать, что я этого не знаю). Единственное, что я изменил, это то, что закрывающий «>» после атрибута был окрашен в красный цвет и сделал его синим. – twfurst

+0

@twfurst - Я не поймал тех, кто был красным. Рад, что мой пример помог. –

Смежные вопросы