Problem mit XSL-Bedingungen(xsl:when...)

marvin hegen

Grünschnabel
hi,

hab ein kleines Probelm, und zwar habe ich eine vorgegebene XML-Struktur die ich nicht veraendern kann. Mit diesem XML-Dokument versuche ich einmal HTML und einmal PDF zu erzeugen. Funktioniert auch alles einwandfrei. Hab nur ein Problem: Im XML-Dokument gibt es 2 Arten von Tables. Erstens das Anfangstag TABLE was dafuer gedacht ist um auf den HTML-Seiten das Layout u gestalten und dann nochmal eine TABLE in dieser TABLE welche dann eine "echte" Tabelle sein soll die in HTML sowie auch PDF dargestellt werden soll(beimeinem Problem geht es nur um PDF). Mein Problem ist jetzt wie ich in XSL mittels einer xsl:when abfrage die Tables und besonders die TDs und TRs voneinander unterscheiden kann. Die uebergeordnete TABLE, sowie auch TRs und TDs sollen in PDF nicht als Tabelle interpretiert werden.


ich habe fogende xml struktur(stark gekuerzt):

Code:
<TABLE width="750px"> 
 <TR>
  <TD>
   <Absatz>.......</Absatz>
  </TD>
 </TR>
 <TR>
  <TD>
   <Absatz>
    <TABLE>
     <TR>
      <TD>
       <Absatz>.........</Absatz>
      </TD>
     </TR> 
    </TABLE>
   </Absatz>
  </TD>
 </TR>
<TABLE>




Um das 2. TABLE-TAG vom ersten zu unterscheiden wollte ich das so machen:

Code:
<xsl:template match="TABLE">
    <xsl:choose>	
      <xsl:when test="parent='Absatz'">
        <xsl:variable name="realTable" select="true"/>
          <fo:table-and-caption >
            <fo:table>
              <fo:table-body>
	<xsl:apply-templates/>
              </fo:table-body>
            </fo:table>
          </fo:table-and-caption >
        </xsl:when>
        <xsl:otherwise>		
            <xsl:apply-templates/>	
        </xsl:otherwise>			
    </xsl:choose>	
</xsl:template>

Das Table-Tag wird also nur als Table interpretiert wenn es auch wirklich eine "echte" Table sein soll.

Ist der xsl:when-part richtig?

Wie schaff ich es jetzt die TRs und die TDs zu identifizieren, dass sie zur "2ten" Table gehoeren und nicht zur "1sten" ?

Kann ich fuer TR zum beispiel den grossvater abfragen? Geht das? Doch was mach ich dann mit den TDs

habt ihr ne idee? waere wirklich sehr hilfreich
 
nicht ganz an die Orignal Frage

zum Testen Xml Datei
Code:
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="C:\excelwork\tabintab.xls"?>
<root>
	<TABLE width="750px">
		<TR>
			<TD>
				<Absatz>1 in der Tabelle 1...........</Absatz>
			</TD>
		</TR>
		<TR>
			<TD>
				<Absatz>
					<TABLE>
						<TR>
							<TD>
								<Absatz>2 in der Tabelle 2.........</Absatz>
							</TD>
						</TR>
						<TR>
							<TD>
								<Absatz>2 in der Tabelle 2.........</Absatz>
							</TD>
						</TR>
					</TABLE>
				</Absatz>
			</TD>
		</TR>
		<TR>
			<TD>
				<Absatz>3 in der Tabelle 1...........</Absatz>
			</TD>
		</TR>
	</TABLE>
</root>

die Xsl Datei

Code:
<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
	<xsl:output method="html" indent="yes"/>
	<xsl:template match="/">
		<html>
			<xsl:apply-templates select="root"/>
		</html>
	</xsl:template>
	<xsl:template match="root">
		<xsl:apply-templates select="TABLE">
			<xsl:with-param name="kn" select="node()"/>
		</xsl:apply-templates>
	</xsl:template>

	<xsl:template match="TABLE" name="tab">

		<xsl:param name="kn"/>
		
		<table border="solid 1px">
			<xsl:apply-templates select="$kn/child::TR"/>
		</table>
	</xsl:template>
	<xsl:template match="TR">
		<tr>
			<xsl:apply-templates select="TD[not(parent::Absatz)]"/>
		</tr>
	</xsl:template>
	<xsl:template match="TD">
		<td>
			<xsl:choose>
				<xsl:when test="not(descendant::TABLE)">
					<xsl:value-of select="Absatz"/>
				</xsl:when>

				<xsl:otherwise>
				<h2>2. Tabelle in der Tabelle 1</h2>
					<xsl:call-template name="tab">
						<xsl:with-param name="kn" select="//Absatz/node()"/>
					</xsl:call-template>
				</xsl:otherwise>
			</xsl:choose>
		</td>
	</xsl:template>
</xsl:stylesheet>

das Probelm ist der Knotendurchlauf und dadurch mus eine
Variable mit Knotenwerten übergeben damit es eine Eindeutigkeit gibt


Code:
<html>
  <table border="solid 1px">
    <tr>
      <td>1 in der Tabelle 1...........</td>
    </tr>
    <tr>
      <td>
        <h2>2. Tabelle in der Tabelle 1</h2>
        <table border="solid 1px">
          <tr>
            <td>2 in der Tabelle 2.........</td>
          </tr>
          <tr>
            <td>2 in der Tabelle 2.........</td>
          </tr>
        </table>
      </td>
    </tr>
    <tr>
      <td>3 in der Tabelle 1...........</td>
    </tr>
  </table>
</html>
 
Zurück