|
Your XML was not valid so I used the following:
<?xml version="1.0" ?>
<ROWDATA>
<ROW>
<TABLE_ROW_DETAILS>XSL-FO to describe the row of a table</TABLE_ROW_DETAILS>
<BLOCKSEQUENCE>1</BLOCKSEQUENCE>
</ROW>
<ROW>
<TABLE_ROW_DETAILS>to describe the row of a table</TABLE_ROW_DETAILS>
<BLOCKSEQUENCE>2</BLOCKSEQUENCE>
</ROW>
<ROW>
<TABLE_ROW_DETAILS>to describe the row of a table</TABLE_ROW_DETAILS>
<BLOCKSEQUENCE>3</BLOCKSEQUENCE>
</ROW>
<ROW>
<TABLE_ROW_DETAILS>to describe the row of a table</TABLE_ROW_DETAILS>
<BLOCKSEQUENCE>1</BLOCKSEQUENCE>
</ROW>
<ROW>
<TABLE_ROW_DETAILS>to describe the row of a table</TABLE_ROW_DETAILS>
<BLOCKSEQUENCE>2</BLOCKSEQUENCE>
</ROW>
<ROW>
<TABLE_ROW_DETAILS>to describe the row of a table</TABLE_ROW_DETAILS>
<BLOCKSEQUENCE>1</BLOCKSEQUENCE>
</ROW>
</ROWDATA>
For illustration, I transformed this XML to HTML into 3 sets of tables. The key to the
transformation is to get the first following sibling of ROW "following-sibling::ROW[1]" and the "blocksequence" parameter that stops the recursion when BLOCKSEQUENCE does not equal it.
<?xml version='1.0'?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<html>
<body>
<xsl:apply-templates select="ROWDATA/ROW[BLOCKSEQUENCE = 1]" mode="page"/>
</body>
</html>
</xsl:template>
<xsl:template match="ROW" mode="page">
<table class="page">
<xsl:apply-templates select="." mode="row">
<xsl:with-param name="blocksequence" select="1"/>
</xsl:apply-templates>
</table>
</xsl:template>
<xsl:template match="ROW" mode="row">
<xsl:param name="blocksequence"/>
<xsl:if test="$blocksequence = BLOCKSEQUENCE">
<tr>
<td><xsl:value-of select="BLOCKSEQUENCE"/><xsl:text>: </xsl:text></td>
<td><xsl:value-of select="TABLE_ROW_DETAILS"/></td>
</tr>
<xsl:apply-templates select="following-sibling::ROW[1]" mode="row">
<xsl:with-param name="blocksequence" select="$blocksequence + 1"/>
</xsl:apply-templates>
</xsl:if>
</xsl:template>
</xsl:stylesheet>
Output:
<html>
<body>
<table class="page">
<tr>
<td>1: </td>
<td>XSL-FO to describe the row of a table</td>
</tr>
<tr>
<td>2: </td>
<td>to describe the row of a table</td>
</tr>
<tr>
<td>3: </td>
<td>to describe the row of a table</td>
</tr>
</table>
<table class="page">
<tr>
<td>1: </td>
<td>to describe the row of a table</td>
</tr>
<tr>
<td>2: </td>
<td>to describe the row of a table</td>
</tr>
</table>
<table class="page">
<tr>
<td>1: </td>
<td>to describe the row of a table</td>
</tr>
</table>
</body>
</html>
"We make a living by what we get, we make a life by what we give." --Winston Churchill
-- modified at 16:27 Monday 17th September, 2007
|
|
|
|
|
Thanks George
Cheers
Tom
Philosophy: The art of never getting beyond the concept of life.
Religion: Morality taking credit for the work of luck.
"The object of life is not to be on the side of the majority, but to escape finding oneself in the ranks of the insane."
- Marcus Aurelius
|
|
|
|
|
Hello All,
I am having issues trying to convert XML to HTML using C#. I have done this before using simple style sheets and simple xml documents.
I now have to do this on a larger scale.
The current issue is that I get an XsltException stating 'matches()' is an unknown XSLT function. This exception is thrown on the xslCompiledTransform.transfrom call.
Is this a standard function? If so how do I use it?
If anyone can help me with this I would greatly appreciate it.
My code snippet.
String outputFile = outputFileTextBox.Text;
XmlUrlResolver resolver = new XmlUrlResolver();
XslCompiledTransform tran = new XslCompiledTransform(true);
tran.Load(new XPathDocument(xsltFileTextBox.Text), XsltSettings.Default, resolver);
tran.Transform(xmlInTextBox.Text, outputFile);
Thanks in advance for all the help.
Phillippio
|
|
|
|
|
|
George,
Thank you very much for this information. It is very helpful.
Have you every used either of these 2 with c#?
Thanks Again
Phillippio
|
|
|
|
|
Actually, I only use C# when I have too. I do most of my programming in C++/CLI, and I have used both in C++/CLI.
"We make a living by what we get, we make a life by what we give." --Winston Churchill
|
|
|
|
|
Hello,
VS 2005
I am using a dataset to write to an xml file using the following
dim dsIncidents as new Dataset()
dsIncidents.WriteXML(xmlIncidentFile, XmlWriteMode.DiffGram)
I use a different dataset to read the xml file
dim dsReadIncidents as new Dataset()
dsReadIncidents(xmlIncidentFile,XmlReadMode.DiffGram) 'When I check the number of tables, there is zero.
However, if I do the following without using the DiffGram it works ok, and I can read the xml file and display the table.
dsIncidents.WriteXML(xmlIncidentFile)
dsReadIncidents(xmlIncidentFile)
Now it will read in the xml file. But I need to read in the DiffGram as I need to track changes to the dataset.
Can anyone tell me what could be the problem in reading and writing using the DiffGram.
Many thanks for any suggestions,
Steve
|
|
|
|
|
Hello Friends ,
I am new in xml , i want use xml as database like sqlserver. how can i
fire insert ,update ,delete command for xml database .
Manu
|
|
|
|
|
Hi,
I am creating an in-memory xml file using XMLDOM.
Does this xml file need to be formatted with CRLFs so that each node is on a new line or does the file as a single line with all the nodes make a difference?
The file has been formatted properly, with begin and end tags but the fact it is saved as one line make a difference?
I feel that it should not make a difference as long as all the tags are set up properly.
For example:
With breaks:
<person>
<lname></lname>
<fname></fname>
<address>/address>
</person>
Without breaks
<person><lname></lname><fname></fname><address>/address></person>
Many thanks.
|
|
|
|
|
Either format is okay! However, the format without breaks loads and parses faster, saves disk space, and possibly some memory. By the way, if you want to make your XML file even smaller, use attributes wherever possible.
"We make a living by what we get, we make a life by what we give." --Winston Churchill
|
|
|
|
|
I'm working on an XML schema for defining flat file layouts. I will be converting our current, template based[1] defintions to XML definitions, and was wondering about how best to express the options for the content of a column in a flat file, especially for exports, i.e. producing the file.
I'm looking at a sequence of Column[2] elements, where each Column element has a name, and a value source. Currently, the value sources are only ADO.NET columns in a data source, or literals. I would however like to expand the potential value sources to include functions etc.
My main concern is how to express the choice of value source. I'll use {} instead of angle brackets to show what I mean. My Column element would look something like:
{Column name="CustomerID" type="System.Int32"}
{DataField query="Customers" field="CustomerNo" /}
{Lookup table="xxx" ..... /}
{Literal}999{/Literal}
{/Column}
I could just use a literal value as a text node below the Column element, but that breaks consistency with the other content types. What suggestions can I get for expressing this?
[1] It is currently a very hard to maintain system where a record layout is defined as s string, with tabs, commas, etc. between output columns. If a non-delimiter string is surrounded by '%' characters, it is the name of a field from the data source to render into that column.
I do not believe they are right who say that the defects of famous men should be ignored. I think it is better that we should know them. Then, though we are conscious of having faults as glaring as theirs, we can believe that that is no hindrance to our achieving also something of their virtues. - W. Somerset Maugham
My New Blog
|
|
|
|
|
Hi,
well I'm trying to use the distinct-nodes function and I've added all sorts of namespaces now. it looks like this:-
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:fn="http://www.w3.org/2004/07/xpath-functions"
xmlns:functx="http://www.functx.com"
xmlns:msxsl="urn:schemas-microsoft-com:xslt"
xmlns:user="urn:my-scripts"
>
-------------------------------------------------
and I'm trying to use it like this:
<xsl:for-each select="functx:distinct-nodes('Inputs/*')">
<td><xsl:value-of select="name()"></xsl:value-of></td>
</xsl:for-each>
----------------------------------------------------
the error is this
The XML page cannot be displayed
Cannot view XML input using XSL style sheet. Please correct the error and then click the Refresh button, or try again later.
--------------------------------------------------------------------------------
Namespace 'http://www.functx.com' does not contain any functions.
Can u plz help me with this, I can't seem to figure out where I'm going wrong
Thanks in advance
Rocky
You can't climb up a ladder with your hands in your pockets.
|
|
|
|
|
Hello everyone,
I'm back again with another problem!!
well I'm trying to display data from an Xml file in the form of a table. for that I'm using XSL and the problem is that now I wanna make the xsl able to display different number of columns in the table.
the data can be in any form such as
<Outputs>
<Compound>BiPhenyl</Compound>
<Value>0.000000005</Value>
<Compound>BiPhenyl</Compound>
<Value>0.000000005</Value>
<Compound>BiPhenyl</Compound>
<Value>0.000000005</Value>
<Compound>BiPhenyl</Compound>
<Value>0.000000005</Value>
<Compound>BiPhenyl</Compound>
<Value>0.000000005</Value>
<Compound>H2O</Compound>
<Value>0.703552320</Value>
</Outputs>
or...
<Outputs>
<Value>0.000018075</Value>
</Outputs>
and the headiings of the columns shoulbe the heading nodes. as you can see in teh previous example that the node name 'compound' and 'value' are reapeated every time for each value but i just need them once.
So the point is that there can be different number of columns to display. How can I make such an arrangement that the xsl should pick up the unique names of the columns and then I can easily go thru the data using foreach and display it.
Thanks in advance
Rocky
You can't climb up a ladder with your hands in your pockets.
|
|
|
|
|
I'm using VB.Net 03 and trying to parse a very large document (cannot make smaller). How do I go about using XMLReader (I'm assuming that's what I would use) to parse XML file against XSL file?
Right now I'm having to programmatically split out the file and parse.
murf
|
|
|
|
|
Hi,
am working on VS.net 2.0 windows application using c#.
while am reading value of node in xml doc it is giving empty string.pls see the code below. can any one give me the solution where I had done mistake.
XmlTextReader reader = new XmlTextReader(@"C:\book.xml");
while (reader.Read())
{
reader.MoveToElement();
if (reader.Name == "year")
{
label1.Text = reader.Value.ToString();
}
}
book.xml file:
<code<?xml version="1.0" encoding="utf-8" ?="">
<bookstore>
<book category="COOKING">
<title lang="en"> Everyday Italian < /title>
<author>Giada De Laurentiis </author>
<year>2005 </year>
<price>30.00 </price>
</book>
</bookstore>
Thanks
-- modified at 7:22 Thursday 6th September, 2007
|
|
|
|
|
You can directly read the xml file in DataSet
using
ds.ReadXML("xmlfilename.xml");
now you can get each Tag as Columns
Best Regards,
Chetan Patel
|
|
|
|
|
XmlTextReader reader = null;
try
{
//Load the reader with the XML file.
reader = new XmlTextReader("c:\\book.xml");
//Parse the XML and display the text content of each of the elements.
while (reader.Read()){
if (reader.IsStartElement()){
if (reader.IsEmptyElement)
Console.WriteLine("<{0}/>", reader.Name);
else{
Console.Write("<{0}> ", reader.Name);
reader.Read(); //Read the start tag.
if (reader.IsStartElement()) //Handle nested elements.
Console.Write("\r\n<{0}>", reader.Name);
Console.WriteLine(reader.ReadString()); //Read the text content of the element.
}
}
}
}
finally
{
if (reader != null)
reader.Close();
}
try this code and remove space in your xml title closing tag in between < and / and put label1.text or what you like instead of Console.WriteLine .
<bookstore>
<book category="COOKING">
<title lang="en"> Everyday Italian !!< /title>!!
<author>Giada De Laurentiis </author>
<year>2005 </year>
<price>30.00 </price>
</book>
</bookstore>
Israr Ali
|
|
|
|
|
Hello everyone,
well I want to make this one as simple as I can.
I have an XML inwhich you can get nodes in this type of format
<LOG>
<LogConfiguration>
</LogConfiguration>
<CallSequence>
<Call>
<ObjectType></ObjectType>
<ObjectName></ObjectName>
<Interface></Interface>
<Method></Method>
<ReturnCode></ReturnCode>
</Call>
<Call>
<ObjectType></ObjectType>
<ObjectName></ObjectName>
<Interface></Interface>
<Method></Method>
<Arguments></Arguments>
<CallSequence>
<Call>....</Call>
</CallSequence>
</LOG>
Now what I'm trying to do is to traverse it recursively using just a single template to tranverse both the /LOG/CallSequence/Call and any CallSequence/Call Elements that occur inside it. So can anyone plz give me an idea of how to do this.
I have made a template that traverses the outer part but i dont know how to reach the inside CallSequence/Call part???!!!
Thanks in advance!
Rocky
You can't climb up a ladder with your hands in your pockets.
|
|
|
|
|
Here is an example:
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<html>
<head>
<title>Call Sequence</title>
</head>
<body>
<xsl:apply-templates select="."/>
</body>
</html>
</xsl:template>
<xsl:template match="CallSequence">
<xsl:for-each select="Call">
<xsl:choose>
<xsl:when test="CallSequence">
<xsl:apply-templates select="CallSequence"/>
</xsl:when>
<xsl:otherwise>
<!--Process the other child nodes-->
</xsl:otherwise>
</xsl:choose>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
"We make a living by what we get, we make a life by what we give." --Winston Churchill
|
|
|
|
|
That looks preetu helpful but the problem is that the xsl I'm working on is very large and accessing the CallSequence/Call is used at two places. So I wanted to use the same template for both. that is for outer as well the inner occurence. The XML can contain any number of call sequences within a call as u know a method can call another method and that can call yet another one so what i'm trying to do is to develop a template which i can call by passing it the set of nodes. Then it should display it.
by the way if we use xsl:template match="CallSequence"... is it able to get all the CallSequence nodes as we traverse down the tree??
Rocky
You can't climb up a ladder with your hands in your pockets.
|
|
|
|
|
its giving an error
The XSL processor stack has overflowed - probable cause is infinite template recursion
what should be the termination condition in this?
Rocky
You can't climb up a ladder with your hands in your pockets.
|
|
|
|
|
<xsl:apply-templates select="CallSequence"/> is the recursive call and will be called if "CallSequence" is a child of itself at any point. If you call this more than once within your xsl:for-each loop, you will run out of stack. Also, it should return once it does not find another child "CallSequence"; however, if your xsl:for-each does not account for a recursive call, it will cause an out-of stack error also. It is very hard to troubleshoot a large template with nested xsl:for-each loops. I advise you to break up your code into several templates. XSLT is functional in nature and you should keep nested levels of xsl:for-each to a minimum.
"We make a living by what we get, we make a life by what we give." --Winston Churchill
|
|
|
|
|
OK that looks helpful to me! Please tell what this statement is doing
<xsl:apply-templates select="."/>
in the example code you've given, When I changed the . to CallSequence it doesnt show anything (atleast the error is gone) but when i put this as you have given it runs out of stack. right now I'm just trying to run your code in order to make an understanding of the template I wanna make at the moment. After I'm done with this I'll concentrate on embedding it in the whole this as a sepearte function like you said
Rocky
You can't climb up a ladder with your hands in your pockets.
|
|
|
|
|
Sorry, my mistake. The "." means current node. It should be "CallSequence".
"We make a living by what we get, we make a life by what we give." --Winston Churchill
|
|
|
|
|
well now I've changed the <xsl:apply-templates select="."/> to
<xsl:apply-templates select="*"/>
and its showing the output BUT... as I was thinking... the Call Node that has other CallSequence nodes is comming out at the end bcz of the stack. Actually the calling function should come at the top rather than at the bottom.
Right now I'm thinking abt another way around. How abt if I use a template to display the Nodes inside a Call and if there is yet another CallSequence I call that template again (using Call-template) with the new Node Set.
Rocky
You can't climb up a ladder with your hands in your pockets.
|
|
|
|