2015-07-30 3 views
1

Я сотни строк текста, которые отформатированы в XML-документ, который мне нужно для вывода в формате PDF и отображения как:XML - XSL - FO XML Dot Лидеры Mutliple появлений

LEFT TEXT.......................................................................RIGHT TEXT 

Я обнаружил, как сделайте это в XSL, но в настоящее время он работает как команда обработки во время вывода FO. XSL:

<xsl:template match="processing-instruction('leftrighttext')"> 
    <fo:block text-align-last="justify"> 
    <xsl:text>LEFT TEXT</xsl:text> 
    <fo:leader leader-pattern="dots"/> 
    <xsl:text>RIGHT TEXT</xsl:text> 
    </fo:block> 

Что XML выглядит (используется в таблице):

<row> 
<entry> <?leftrighttext?> </entry> 
</row 

Желаемая Выход:

LEFT TEXT........................................................................RIGHT TEXT 
NEXT TEXT WITHIN TABLE...........................................................OTHER TEXT 

Мой вопрос заключается в том, как бы я получить «ЛЕВЫЙ TEXT "и" RIGHT TEXT ", которые будут вызываться из документа XML, вместо ввода значений непосредственно в таблице стилей, например:

<row> 
<entry>LEFT TEXT <sometag> RIGHT TEXT</entry> 
</row> 
<row> 
<entry>NEXT TEXT WITHIN TABLE <sometag> OTHER TEXT 

Есть ли тэг, который я могу создать, или строку для идентификации текста перед тегом и текст после, вводят литеры точек между ними?

Любая помощь будет оценена по достоинству.


Дополнительная информация Запрашиваемые: Я использовал XSLT отправил в ответ ниже, вот XML документ Я пытаюсь преобразовать. Я также следил за контуром XML, который был опубликован ниже. Пожалуйста, дайте мне знать, что я не хватает ...

XML:

<?xml-model href="http://docbook.org/xml/5.0/rng/docbook.rng" schematypens="http://relaxng.org/ns/structure/1.0"?> 
<?xml-model href="http://docbook.org/xml/5.0/rng/docbook.rng" type="application/xml" schematypens="http://purl.oclc.org/dsdl/schematron"?> 
<section xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink" 
    version="5.0">  
    <table> 
     <tgroup cols="2"> 
      <colspec colnum="1" colname="col1" colwidth="235"/> 
      <colspec colnum="2" colname="col2" colwidth="235"/> 
      <thead> 
       <row> 
        <entry align="center">LSP</entry> 
        <entry align="center">RSP</entry> 
       </row> 
      </thead> 
      <tbody> 
       <row> 
        <entry align="center" namest="col1" nameend="col2">(PF) Takeoff Briefing<?leftrighttext?>PERFORM</entry> 
       </row> 
      </tbody> 
     </tgroup> 
    </table> 
</section> 

Это то, что я для начала таблицы стилей:

XSLT:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:date="http://exslt.org/dates-and-times" 
xmlns:xs="http://www.w3.org/2001/XMLSchema" 
xmlns:fo="http://www.w3.org/1999/XSL/Format" 
xmlns:d="http://docbook.org/ns/docbook" 
exclude-result-prefixes="xs date" 
extension-element-prefixes="date" 
version="1.0"> 
<xsl:import href="http://docbook.sourceforge.net/release/xsl-ns/current/fo/docbook.xsl"/> 
+0

Показать соответствующий образец вашего XML, то XSLT у вас есть до сих пор, и какой вид продукции вы ожидаете, именно, для образца XML. – Tomalak

+0

Отредактировано, спасибо! – BSailor

+0

Я не совсем понимаю, на каком XML вы смотрите - тот, у которого есть '' PI не имеет никаких данных, а что другого? – Tomalak

ответ

3

Я бы придерживался вашего первоначального подхода к использованию инструкции обработки. Вам просто нужно использовать xsl:apply-templates для создания fo:table-cell.

Пример:

XML-вход

<doc> 
    <row> 
     <entry>LEFT TEXT <?leftrighttext?> RIGHT TEXT</entry> 
    </row> 
    <row> 
     <entry>NEXT TEXT WITHIN TABLE <?leftrighttext?> OTHER TEXT</entry> 
    </row>  
</doc> 

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:strip-space elements="*"/> 

    <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"> 
        <fo:table> 
         <fo:table-body> 
          <xsl:apply-templates select="row"/>        
         </fo:table-body> 
        </fo:table> 
       </fo:flow> 
      </fo:page-sequence> 
     </fo:root> 
    </xsl:template> 

    <xsl:template match="row"> 
     <fo:table-row> 
      <xsl:apply-templates select="entry"/> 
     </fo:table-row> 
    </xsl:template> 

    <xsl:template match="entry"> 
     <fo:table-cell> 
      <fo:block text-align-last="justify"> 
       <xsl:apply-templates/> 
      </fo:block> 
     </fo:table-cell> 
    </xsl:template> 

    <xsl:template match="entry/text()"> 
     <xsl:value-of select="normalize-space()"/> 
    </xsl:template> 

    <xsl:template match="processing-instruction('leftrighttext')"> 
     <fo:leader leader-pattern="dots"/> 
    </xsl:template> 

</xsl:stylesheet> 

XSL-FO Выход

<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:table> 
      <fo:table-body> 
       <fo:table-row> 
        <fo:table-cell> 
        <fo:block text-align-last="justify">LEFT TEXT<fo:leader leader-pattern="dots"/>RIGHT TEXT</fo:block> 
        </fo:table-cell> 
       </fo:table-row> 
       <fo:table-row> 
        <fo:table-cell> 
        <fo:block text-align-last="justify">NEXT TEXT WITHIN TABLE<fo:leader leader-pattern="dots"/>OTHER TEXT</fo:block> 
        </fo:table-cell> 
       </fo:table-row> 
      </fo:table-body> 
     </fo:table> 
     </fo:flow> 
    </fo:page-sequence> 
</fo:root> 

Вынесено PDF

enter image description here


ОБНОВЛЕННЫЙ ПРИМЕР

Глядя на ваш XML-пример обновления, я вижу, что у вас есть пространство имен по умолчанию (xmlns="http://docbook.org/ns/docbook"). Вам следует объявить, что пространство имен с префиксом в вашем XSLT, а затем использовать этот префикс в ваших XPath.

Если вы используете XSLT 2.0, вместо этого вы можете добавить xpath-default-namespace="http://docbook.org/ns/docbook" в свой и не изменять никаких своих XPath.

Трудно рекомендовать что-то конкретное, потому что вы не показали полный XSLT (или даже шаблон, который показывает нам контекст того, где создается твой), так что это полное предположение.

Вот пример использования вашего обновленного XML и объявление пространства имен http://docbook.org/ns/docbook с префиксом doc.

(я не пытался обрабатывать заголовки таблицы или что-нибудь подобное, что просто держать его просто.)

XML Input

<section xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink" 
    version="5.0">  
    <table> 
     <tgroup cols="2"> 
      <colspec colnum="1" colname="col1" colwidth="235"/> 
      <colspec colnum="2" colname="col2" colwidth="235"/> 
      <thead> 
       <row> 
        <entry align="center">LSP</entry> 
        <entry align="center">RSP</entry> 
       </row> 
      </thead> 
      <tbody> 
       <row> 
        <entry align="center" namest="col1" nameend="col2">(PF) Takeoff Briefing<?leftrighttext?>PERFORM</entry> 
       </row> 
      </tbody> 
     </tgroup> 
    </table> 
</section> 

XSLT 1,0

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

    <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="doc:table"> 
     <fo:table> 
      <fo:table-body> 
       <xsl:apply-templates select="doc:tgroup/doc:tbody/doc:row"/>        
      </fo:table-body> 
     </fo:table>   
    </xsl:template> 

    <xsl:template match="doc:row"> 
     <fo:table-row> 
      <xsl:apply-templates select="doc:entry"/> 
     </fo:table-row> 
    </xsl:template> 

    <xsl:template match="doc:entry"> 
     <fo:table-cell> 
      <fo:block text-align-last="justify"> 
       <xsl:apply-templates/> 
      </fo:block> 
     </fo:table-cell> 
    </xsl:template> 

    <xsl:template match="doc:entry/text()"> 
     <xsl:value-of select="normalize-space()"/> 
    </xsl:template> 

    <xsl:template match="processing-instruction('leftrighttext')"> 
     <fo:leader leader-pattern="dots"/> 
    </xsl:template> 

</xsl:stylesheet> 

Выход XSL-FO

<fo:root xmlns:doc="http://docbook.org/ns/docbook" 
     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:table> 
      <fo:table-body> 
       <fo:table-row> 
        <fo:table-cell> 
        <fo:block text-align-last="justify">(PF) Takeoff Briefing<fo:leader leader-pattern="dots"/>PERFORM</fo:block> 
        </fo:table-cell> 
       </fo:table-row> 
      </fo:table-body> 
     </fo:table> 
     </fo:flow> 
    </fo:page-sequence> 
</fo:root> 

Вынесено PDF

enter image description here

+0

Спасибо. Я попытался применить этот XSLT, и я получаю сообщение об ошибке, когда пытаюсь его преобразовать: ERROR - Исключение net.sf.saxon.trans.XPathException: org.apache.fop.fo.ValidationException: «fo: table-body» отсутствует дочерние элементы. Требуемая модель содержимого: маркер * (таблица-строка + | таблица-ячейка +) – BSailor

+0

@BSailor. Можете ли вы обновить свой вопрос с помощью образца xml и xslt, который будет воспроизводить эту проблему? Это единственный способ помочь вам определить, почему «fo: table-body» не хватает требуемых детей. –

+0

Обновлено с дополнительной информацией, спасибо! – BSailor

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

  • Нет связанных вопросов^_^