[XML/XSL] Przekształcanie na PDF

0

Witam.

Mam mały problem, otóż jest sobie plik XML:

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="osoby.xsl"?>

<osoby xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="osoby.xsd">
	
	<osoba plec="K" blizna="Nie">
  <imie>Jan</imie>
  <nazwisko>Nowak</nazwisko>
  <adres>ul. Wymyslona 2 62-437 Poznan</adres>
	</osoba>
	
	<osoba plec="M" blizna="Tak">
  <imie>Zbigniew</imie>
  <nazwisko>Kowalski</nazwisko>
  <adres>os. Bajkowe 14/3 60-321 Poznan</adres>
	</osoba>
	
</osoby>

i teraz stworzyłem dla niego plik XSL (XSLT + XSL-FO), umożliwiający przekształcenie go na PDF i ładne sformatowanie w tabelkę:

<?xml version="1.0" encoding="UTF-8"?>
<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 method="xml" />

	<xsl:template match="/osoby">
  <fo:root>
  	<fo:layout-master-set>
    <fo:simple-page-master master-name="str_gl" page-height="400mm" page-width="300mm" margin-top="10mm" margin-bottom="10mm" margin-left="15mm" margin-right="20mm">
    	<fo:region-body margin-top="0mm" margin-bottom="10mm" margin-left="0mm" margin-right="0mm" />
    	<fo:region-after extent="10mm" />
    </fo:simple-page-master>
  	</fo:layout-master-set>
  	
  	<fo:page-sequence master-reference="str_gl">
    <fo:flow flow-name="xsl-region-body">
    	<fo:table>
      <fo:table-column column-width="88mm" />
      <fo:table-column column-width="62mm" />
      <fo:table-column column-width="35mm" />
      <fo:table-column column-width="50mm" />
      <fo:table-column column-width="50mm" />
      
      <fo:table-body>
      	<fo:table-row>
          <fo:table-cell>
           <fo:block font-size="10pt" font-weight="bold" text-align="left">Imie</fo:block>
          </fo:table-cell>
          
          <fo:table-cell>
           <fo:block font-size="10pt" font-weight="bold" text-align="left">Nazwisko</fo:block>
          </fo:table-cell>
      
          <fo:table-cell>
           <fo:block font-size="10pt" font-weight="bold" text-align="left">Adres</fo:block>
          </fo:table-cell>

          <fo:table-cell>
           <fo:block font-size="10pt" font-weight="bold" text-align="left">Plec</fo:block>
          </fo:table-cell>

          <fo:table-cell>
           <fo:block font-size="10pt" font-weight="bold" text-align="left">Czy ma blizne?</fo:block>
          </fo:table-cell>
      	</fo:table-row>
      	
      	<xsl:apply-templates />
      	
      </fo:table-body>
    	</fo:table>
    </fo:flow>
  	</fo:page-sequence>
  </fo:root>
	</xsl:template>

	<xsl:template match="osoba">
  <fo:table-row>
  	<xsl:apply-templates />
  </fo:table-row>
	</xsl:template>
	
	<xsl:template match="imie">
  <fo:table-cell text-align="left">
  	<fo:block font-size="10pt">
    <xsl:value-of select="." />
  	</fo:block>
  </fo:table-cell>
	</xsl:template>

	<xsl:template match="nazwisko">
  <fo:table-cell text-align="left">
  	<fo:block font-size="10pt">
    <xsl:value-of select="." />
  	</fo:block>
  </fo:table-cell>
	</xsl:template>
	
	<xsl:template match="adres">
  <fo:table-cell text-align="left">
  	<fo:block font-size="10pt">
    <xsl:value-of select="." />
  	</fo:block>
  </fo:table-cell>
	</xsl:template>
	
	<xsl:template match="???">                            <----------------------------
  <fo:table-cell text-align="left">
  	<fo:block font-size="10pt">
    <xsl:value-of select="@plec" />
  	</fo:block>
  </fo:table-cell>
	</xsl:template>

	<xsl:template match="???">                            <----------------------------
  <fo:table-cell text-align="left">
  	<fo:block font-size="10pt">
    <xsl:value-of select="@blizna" />
  	</fo:block>
  </fo:table-cell>
	</xsl:template>

</xsl:stylesheet>

Niestety - nie wiem jak wyciągnąc i wstawić do pliku PDF wartości parametrów pliku XML (wskazane strzałką), próbowałem na wiele różnych sposobów i nie mogę sobie poradzić :/

Bardzo proszę o jakąkolwiek pomoc.
Pozdrawiam.

p.s. Do przekształcania plików używam fopa w wersji 0.90alpha1
p.s.2. Jak widać, nie używam ogonków w dokumentach, ponieważ fop ich nie lubi i w PDF'ie wychodzą krzaki, jeżeli ktoś mógłby pomóc (przy okazji) również w tej kwestii, będę wdzięczny :)

0

Dla każdej OSOBY należy stworzyć kolejną kolumnę płeć i blizna, czyli po wywołaniu wszystkich template'ów Imię, Nazwisko itp. należy stworzyć 2 kolumny płeć i blizna czyli:

<xsl:template match="osoba">
fo:table-row

<!-- wywołanie innych template'ów: Imię itp. -->

<xsl:apply-templates />

<!-- Wypisanie parametru płeć-->

<fo:table-cell text-align="left">
  <fo:block font-size="10pt">
    <xsl:value-of select="@plec" />
  </fo:block>
</fo:table-cell>

<!-- Wypisanie parametru blizna-->

<fo:table-cell text-align="left">
  <fo:block font-size="10pt">
    <xsl:value-of select="@blizna" />
  </fo:block>
</fo:table-cell>

</fo:table-row>
</xsl:template>

Za ew. pomyłkę przepraszam bo nie znam poleceń <fo: ...>, na razie znam tylko XML + XSLT. Popraw ewentualnie duże parametry plec na Plec czy jak tam masz ustawione.

//DOpisane
Korzystając z tego rozwiązania oczywiście usuń te 2 ostatnie template'y gdzie nie wiedziałeś do jakich węzłów mają się odnosić (match="???")

0

Nawet nie wiesz jak bardzo mi pomogłeś - dziękuję Ci bardzo :)
Teraz dopiero widzę jakie to jasne i przejrzyste :)

A tak to powinno poprawnie wyglądać (fragment XSLT do zmiany):


	<xsl:template match="osoba">
		<fo:table-row>
			
			<fo:table-cell text-align="left">
				<fo:block font-size="10pt">
					<xsl:value-of select="imie" />
				</fo:block>
			</fo:table-cell>

			<fo:table-cell text-align="left">
				<fo:block font-size="10pt">
					<xsl:value-of select="nazwisko" />
				</fo:block>
			</fo:table-cell>
	
			<fo:table-cell text-align="left">
				<fo:block font-size="10pt">
					<xsl:value-of select="adres" />
				</fo:block>
			</fo:table-cell>
			
			<xsl:apply-templates />
			
			<fo:table-cell text-align="left">
				<fo:block font-size="10pt">
					<xsl:value-of select="@plec" />
				</fo:block>
			</fo:table-cell>

			<fo:table-cell text-align="left">
				<fo:block font-size="10pt">
					<xsl:value-of select="@blizna" />
				</fo:block>
			</fo:table-cell>			
			
		</fo:table-row>
	</xsl:template>

Jeszcze raz bardzo Ci dziękuję :)

Pozdrawiam.

0
m010ch napisał(a)

Jeszcze raz bardzo Ci dziękuję :)

Pozdrawiam.

Nie ma za co, do usług :)
Ja też pozdriawiam.

1 użytkowników online, w tym zalogowanych: 0, gości: 1