|
I'll take a look at it in a few minutes to see if I can produce an XML for you. You might have a different version of FOP, or there might be some kind of problem with the parsing.
Logifusion[^]
|
|
|
|
|
ok thank you but before you do i think i found something. Now i can display the "title" section in the pdf document i created...
instead of using <xsl:template match="/"> in the beginning, i'm using <xsl:temlate match="ClientLookUp">
and then i'm apply that template too.
Like this...
<?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:template match="ClientLookUp">
<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
<fo:layout-master-set>
<fo:simple-page-master master-name="simple"
page-height="29.7cm"
page-width="21cm"
margin-top="1cm"
margin-bottom="2cm"
margin-left="1.5cm"
margin-right="1.5cm">
<fo:region-body margin-top="2cm"/>
<fo:region-after extent="1.5cm"/>
<fo:region-before extent="1.5cm"/>
</fo:simple-page-master>
</fo:layout-master-set>
<fo:page-sequence master-reference="simple">
<fo:flow flow-name="xsl-region-body">
<fo:block>
<xsl:apply-templates select="ClientLookUp"/>
<xsl:apply-templates select="Title"/>
<xsl:apply-templates select="TableEntries"/>
</fo:block>
</fo:flow>
</fo:page-sequence>
</fo:root>
</xsl:template>
<xsl:template match="Title">
<fo:block font-size="18pt"
font-family="sans-serif"
line-height="20pt"
space-after.optimum="1pt"
background-color="blue"
color="white"
text-align="center"
padding-top="3pt">
<xsl:value-of select="Heading"/>
</fo:block>
<fo:block font-size="16pt"
font-family="sans-serif"
line-height="18pt"
space-after.optimum="1pt"
background-color="blue"
color="white"
text-align="center"
padding-top="3pt">
<xsl:value-of select="DateCreated"/>
</fo:block>
</xsl:template>
<xsl:template match="TableEntries">
<fo:block width="510pt">
<fo:table table-layout="fixed" width="510pt">
<xsl:if test="TableInfo/ClientName">
<fo:table-column column-width="50pt" font-size="7pt" border="1" border-color="black" border-style="solid" padding="2pt"/>
<fo:table-column column-width="50pt" font-size="7pt" border="1" border-color="black" border-style="solid" padding="2pt"/>
</xsl:if>
<fo:table-body>
<fo:table-row>
<xsl:for-each select="TableInfo">
<xsl:if test="ClientName">
<fo:table-cell>
<fo:block>
Client Name
</fo:block>
</fo:table-cell>
<fo:table-cell>
<fo:block>
<xsl:value-of select="ClientName"/>
</fo:block>
</fo:table-cell>
</xsl:if>
</xsl:for-each>
</fo:table-row>
</fo:table-body>
</fo:table>
</fo:block>
</xsl:template>
</xsl:stylesheet>
He who laughs last...
|
|
|
|
|
Ah, now we're getting somewhere. First of all, I think you should download a newer version of FOP, because the one you have doesn't seem to have all the features you need. I'm currently working with 0.91beta, but there's a 0.92. Head out here to download it: http://xmlgraphics.apache.org/fop/download.html[^]
The next thing is that you changed the first template match and that's fine, but don't do this:
<xsl:apply-templates select="ClientLookUp"/>
It's just an unnecessary call and it's only going to confuse you as to how the template matching works. The first template you have was matching on the document root but wasn't actually going into the document element. It couldn't see Title and TableEntries because they were one level deeper than where it was looking.
Also, my version of FOP is giving your XSL the following error: For fo:simple-page-master, fo:region-before must be declared before fo:region-after.
So, in your ClientLookUp template, reverse the order of region-before and region-after:
<fo:region-body margin-top="2cm"/>
<fo:region-before extent="1.5cm"/>
<fo:region-after extent="1.5cm"/>
This at least gets your PDF to come out. I'm sure it's not going to look like you want it to, but at least this gives you something you can look at.
Logifusion[^]
|
|
|
|
|
Thank you
He who laughs last...
|
|
|
|
|
Thanks for your help... i've done it.
There is still one thing though... Is it possible to go to a new row if the column is at the end of a page? Because i give the user the option to select what he/she wants to see on the report but if they choose to see everything i have a problem... i line up the columns next to each other and as it reaches the end of the page i want it to go to the next row. I just need to know if it is possible, i'll find a way if it is...
my xml and xsl is in the next post.
He who laughs last...
|
|
|
|
|
My first reaction is that you really wouldn't be able to do this. It's kind of like an HTML table, it just doesn't wrap around to the next row. Instead, I would say you change the page layout to landscape. If the business won't move, I'd just reduce the font to a point where everything will fit. That's usually enough to convince them to go to landscape.
Logifusion[^]
|
|
|
|
|
LOL
Thanks.
But going landscape wouldn't work... i think... Say that the result brings back loads of records and the user only selected to see the client names. It would be a waste. But thanks never the less.
He who laughs last...
|
|
|
|
|
Last Question...
i still have the problem of displaying the selected items next to each other and if the columns reach the end of the page that it should go to the next line. Is it possible to say <in a if statement> that if the table width reaches a certain length, that it should insert a new row?
He who laughs last...
|
|
|
|
|
Here's the way I see it. You have to separate XSL from FO. Think of FO as being pretty much static. Although the FO processor will arrange FO blocks to create the pages, there is no conditional control that happens in FO (which can be very annoying). XSL is where all the conditional control happens. The trouble is that XSL will not know things about FO like widths or heights. You can write an if statement into your XSL, but it doesn't know if the table columns will extend too far across the page. So the only data you really know is how many columns you're going to put on the table.
Based on the number of columns, you can write your XSL to create two table rows per row of data. You could also do other things like reduce font size or change the layout of that page to landscape (but that's more trouble than it's worth).
HTH
Logifusion[^]
|
|
|
|
|
What if i created a counter <not shure how> that i incrament each time a column is created, when the counter reaches a cetain amount <lets say 6> create a new row?
He who laughs last...
-- modified at 12:18 Wednesday 12th July, 2006
|
|
|
|
|
You could create an <xsl-variable> to hold your counter. When it hits a certain number, end the current row and start another one. I think that's a good solution.
Logifusion[^]
|
|
|
|
|
Thanks for your time...
He who laughs last...
|
|
|
|
|
hi, i just wanted to tell you, you were right. I made the font very small and my boss told me to landscape. thank you for all your help.
He who laughs last...
|
|
|
|
|
|
Okay no, The xsl is to long now...
He who laughs last...
|
|
|
|
|
Hi Friend,
I have exported a crystal file as an XML file.
Now I want to read that file using ASP.net.
Does any one help me how to read Crystal Exported XML file using ASP.NET.?
Thanks
Naveed Kamboh
|
|
|
|
|
I'm trying to develop an application wherein I have an XML file. The contents of this XML file should be dynamically converted into a C# class(with properties). I learnt when the contents of a C# file object ie properties are given to Microsoft Property Grid in .NET, the fields in the grid are populated with the C# class properties.
Lets say for XML1 there is one property grid UI and for XML2 there is another property grid UI. The point that I'm trying to stress is that depending on the XML a particular UI comes up.
The whole idea behind the above design is to show XML data to the user and when the user edits the data from the grid the XML file gets updated.
I was exploring the idea of developing a wizard in VC8 that should address this situation. The wizard shall be similar to something like that in VC applications. On invoking it shall ask for the kind of XML file that the Property Grid should be generated for.Depeding on that somewhere there should be logic to convert this XML input to a C# file so that by the time the wizrd is finished wiht poicking the XML file the property grid is already populated.
I know of some of the tools that are available that address this situation. Any insight on this front shall be highly appreciated.
Thanks
-- modified at 2:17 Monday 10th July, 2006
|
|
|
|
|
Hi guys,
I am validating my xml with schema.
the validation rotine return line number and line position, if the validation fails.
given the line number,line position i can get to node that fails the validation test using IXmlLineInfo.
see http://msdn2.microsoft.com/en-us/library/system.xml.ixmllineinfo.aspx
I need to build the xpath from that node
any ideas are helpfull
Thanks
Mustafa
http://www.hostukdomain.com
|
|
|
|
|
What I would suggest is that you take advantage of the position() function. The problem you'll be up against is that you may have a lot of similar nodes. So, if you have XML that looks like this:
<Foo>
<Bar>9</Bar>
<Bar>7</Bar>
<Bar>asd</Bar>
</Foo>
Maybe the asd is the part that fails the schema, so you need an XPath that gets to the third Bar node. You could write something like this:
/Foo/Bar[position()=3]
If you know the node that fails, you should be able to get an XPath to it.
Logifusion[^]
|
|
|
|
|
<Thanks Dustin
Indeed a very similar position coz i could have multiple nodes of same name.
I am thinking abt ur solution but during runtime i might not know the node position that could fail.
sample xml
<root>
<level1>
<nest11</nest1>
<nest2>2</nest2>
</level1>
<level2>
<nest1>1</nest1>
<nest2>some bad value</nest2><!-- say this node fails -->
</level2>
</root>
then i should run some rotine to return /root/level2/nest2
i will try position() function but if can throw more light will be helpfull.
cheers
Mustafa
http://www.hostukdomain.com[^]
-- modified at 11:30 Friday 7th July, 2006
|
|
|
|
|
Well, first you have to change the <'s and >'s to <'s and >'s so I can see your XML. But I would say if you have the actual XmlNode object representing the node that has the error, you could get its parent. With the parent node, search through its child nodes to find the current node you're holding. You should be able to get an index. Add 1 to it and get the position.
Logifusion[^]
|
|
|
|
|
hope you can see the xml now
I will try what you have suggested... just to let you know i am using XmlValidatingReader to derive the IXmlLineInfo which has the lineinfo
I will try and see if I could use XPathDocument or XMLDataDocument but not sure if i can get the node using the lineinfo
will try and post back..
all have nice weekend
cheers
Mustafa
http://www.hostukdomain.com[^]
-- modified at 12:35 Friday 7th July, 2006
|
|
|
|
|
Hi All,
I'm trying to get my flow right with the xml and xsl files...
is it possible to do the following...
my xml file looks like this...
<ClientLookUp>
<Title>
<Heading>WhatEver</Heading>
<Date>TodayOrWhatEver</Date>
</Title>
<TableEntries key="0">
<ClientName>exampleJohn</ClientName>
<ClientSurname>exampleSmith</ClientSurname>
<ClientAge>example21</ClientAge>
<ClientID>example8501014341988</ClientID>
<ClientType>WhateEver</ClientType>
<ClientBday>example01January</ClientBday>
<ClientTelH>example903-0201</ClientTelH>
<ClientFaxH>example903-0202</ClientFaxH>
<ClientEmailH>exampleJohn@Home.co.za</ClientEmailH>
<ClientTelW>example903-0203</ClientTelW>
<ClientFaxW>example903-0204</ClientFaxW>
<ClientEmailW>exampleJohn@Work.co.za</ClientEmailW>
<ClientCell>example903-0205</ClientCell>
</TableEntries>
<TableEntries key="1">
<ClientName>exampleSam</ClientName>
<ClientSurname>exampleLooker</ClientSurname>
<ClientAge>example22</ClientAge>
<ClientID>example8501014341982</ClientID>
<ClientType>WhateEver</ClientType>
<ClientBday>example01January</ClientBday>
<ClientTelH>example903-0301</ClientTelH>
<ClientFaxH>example903-0302</ClientFaxH>
<ClientEmailH>exampleSam@Home.co.za</ClientEmailH>
<ClientTelW>example903-0303</ClientTelW>
<ClientFaxW>example903-0304</ClientFaxW>
<ClientEmailW>exampleSam@Work.co.za</ClientEmailW>
<ClientCell>example903-0305</ClientCell>
</TableEntries>
</ClientLookUp>
is it possible to, Depending on whitch of these tags are created, that they could follow up on each other whith spaces between them?
He who laughs last...
-- modified at 4:48 Friday 7th July, 2006
|
|
|
|
|
Like for instance....
if only the ClientName and the ClientTelH was selected in my program and i created the ClientName and the ClientTelH tags only...
i want it to display like this...
exampleJohn 903-0201
exampleSam 903-0301
better yet
can i create a tabel and the cell only as tags are created? to be able to align the output?
for instance...
exampleJohn 903-0201
exampleSam 903-0301
any help whould be greatly appreciated.
Thank you in advance...
He who laughs last...
|
|
|
|
|
Use
<xsl:for-each select="//ClientLookUp/TableEntries">
to iterate thru each entry and
use
<xsl:if test="">
to find out if the node exist then dump the data as you want
Jup
-- modified at 11:03 Friday 7th July, 2006
|
|
|
|