2017-02-17 9 views
0

Мне нужна помощь с шаблоном в xsl-fo для создания pdf-файла из XML-данных.Таблица xsl-fo для отображения данных xml для создания pdf

Моя проблема заключается в том, что мне нужно создать таблицу, которая получает только один элемент (узел) многих.

Для exaple я мог бы иметь XML, который выглядит, как этот

<CollectionOfItems> 
<items> 
<title ID="someid" location="somelocation" price="someprice"/> 
<title ID="someid" location="somelocation" price="someprice"/> 
<title ID="someid" location="somelocation" price="someprice"/> 
</items> 
<items> 
<title ID="someid" location="somelocation" price="someprice"/> 
<title ID="someid" location="somelocation" price="someprice"/> 
<title ID="someid" location="somelocation" price="someprice"/> 
</items> 
</items> 
<title ID="someid" location="somelocation" price="someprice"/> 
<title ID="someid" location="somelocation" price="someprice"/> 
<title ID="someid" location="somelocation" price="someprice"/> 
<title ID="someid" location="somelocation" price="someprice"/> 
<title ID="someid" location="somelocation" price="someprice"/> 
<title ID="someid" location="somelocation" price="someprice"/> 
</items> 
</CollectionOfItems> 

Каждый «пункты» узлы должны находиться в отдельной таблице ... так что я сделал таблицу в XSL-FO таблицы, которая выглядит как это

<fo:table width="100%" border-style="outset" border-width="2pt" background-repeat="no-repeat"> 
<fo:table-column/> 
<fo:table-column/> 
<fo:table-column/> 
<fo:table-body> 
    <xsl:for-each select="/Items/item/DataModification/Form/Tab/ModControl/Value/CompetenceConfig/Chapters/Chapter"> 
     <xsl:variable name="Chapter" select="."/> 
     <fo:table-row> 
      <fo:table-cell border-style="inset" border-width="2pt" padding="2pt" background-repeat="repeat" display-align="center"> 
       <fo:block> 
        <xsl:value-of select="@ID"/> 
       </fo:block> 
      </fo:table-cell> 
      <fo:table-cell border-style="inset" border-width="2pt" padding="2pt" background-repeat="repeat" display-align="center"> 
       <fo:block> 
        <xsl:value-of select="@location"/> 
       </fo:block> 
      </fo:table-cell> 
      <fo:table-cell border-style="inset" border-width="2pt" padding="2pt" background-repeat="repeat" display-align="center"> 
      <fo:block> 
       <xsl:value-of select="@price"/> 
      </fo:block> 
      </fo:table-cell> 
     </fo:table-row> 
    </xsl:for-each> 
</fo:table-body> 

Это своего рода работает, но вместо того, чтобы, например, один «пункты» узел с деталями внутри каждую таблицу я получаю 3 таблицы с «пунктами» узлы, которые выглядят S- AME. Как я могу показать первый элемент «узлы» в первой таблице, второй узел «items» во второй таблице и так далее? Я бы очень признателен за любую помощь в этом. Я пытался решить это в течение нескольких дней, и я новичок в xsl-fo.

Большое спасибо!

+0

Показаны нас это в вашем XSL: /товаров/пункт/DataModification/Форма/Tab/ModControl/Значение/CompetenceConfig/главы/Глава И затем предоставляя XML, который даже близко не к тому, что структура (ни шаблон выше него) бесполезен. Никто не может догадаться о том, в каком контексте вы работаете. –

+0

Итак, чтобы вы объяснили дальше и основываясь на своем вводе ... вы говорите, что хотите шесть таблиц? Первый будет иметь 3 строки, а второй - три строки. третьи три строки, четвертый, пятый и шесть по одному ряду? Это то, что вы просите? –

+0

Извините, Кевин, я хотел изменить это на/CollectionOfItems/items/title. – jcolon

ответ

1

Как насчет этого? Не зная, что у вас есть и исправление ошибок у вас есть в вашем XML ....

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format"> 
    <xsl:template match="/"> 
     <fo:root> 
      <fo:layout-master-set> 
       <fo:simple-page-master master-name="page" page-width="8.5in" page-height="11in" margin-top="0.5in" margin-bottom="0.5in" margin-left="0.5in" margin-right="0.5in"> 
        <fo:region-body region-name="body" margin-top="0.5in" margin-bottom="0.5in" margin-left="0.5in" margin-right="0.5in"/> 
       </fo:simple-page-master> 
      </fo:layout-master-set> 
      <fo:page-sequence master-reference="page"> 
       <fo:flow flow-name="body"> 
        <xsl:apply-templates/> 
       </fo:flow> 
      </fo:page-sequence> 
     </fo:root> 
    </xsl:template> 
    <xsl:template match="items"> 
     <fo:block space-before="6pt" border-top="3pt solid green"> 
      <fo:table> 
       <fo:table-body> 
        <xsl:apply-templates/> 
       </fo:table-body> 
      </fo:table> 
     </fo:block> 
    </xsl:template> 
    <xsl:template match="title"> 
     <fo:table-row> 
      <xsl:apply-templates select="@*"/> 
     </fo:table-row> 
    </xsl:template> 
    <xsl:template match="@ID | @location | @price"> 
     <fo:table-cell border="1pt solid black"> 
      <fo:block> 
       <xsl:value-of select="."/> 
      </fo:block> 
     </fo:table-cell> 
    </xsl:template> 
</xsl:stylesheet> 

Урожайность это:

enter image description here

Это шаблоны, которые создает таблицу для каждого «пунктов» тег, строку для каждого тега «title» и ячейку для каждого из атрибутов в теге «title». Я считаю, что это то, чего вы хотите.

+3

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

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