|
Hi Guys, wondering if you can help me again,
I need to write a stylesheet for a xml document, i need to convert it to a html table with a header, i can get the header working and get the table created but i can't get the xml put within the table.
the code is below do you any ideas, i thought this was quite a simple task but its turns out harder than i thought.
xml sample - there is more to the code but this is a example, with the report is the title and other info but that is not relevent as the arguments fields is what i need to put into a table
<report-item-definition>
<arguments>
<argument>
<name>xVar</name>
<type>Column</type>
<default>@IPRED</default>
<display-name>X Axis Variable</display-name>
<description>X Axis Variable</description>
<visible>FALSE</visible>
<filter-type>@ALL</filter-type>
</argument>
<argument>
</report-item-definition>
The table show look like the following
Name - Type - Default - Display Name - Description - Visible - Filter Type
At the moment my style sheet looks like this - but it does not seem to be working
<?xml version="1.0" ?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" >
<xsl:template match ="/">
<html>
<head>
<title>XML Stylesheet</title>
</head>
<body>
<h1 align="center"><b><xsl:value-of
select="report-item-definition/item-title" /></b></h1>
<xsl:apply-templates />
</body>
</html>
</xsl:template>
<xsl:template match="report-item-definition/arguments">
<table width="700" border="1" align="center" style="font-family:verdana
font-size:10pt">
<tr bgcolor = "#cccccc">
<td width="130" align="center"><b>Name</b></td>
<td align="center"><b>Type</b></td>
<td align="center"><b>Default</b></td>
<td align="center"><b>Display Name</b></td>
<td align="center"><b>Description</b></td>
<td align="center"><b>Visible</b></td>
<td align="center"><b>Filter Type</b></td>
</tr>
<xsl:for-each select="arguments/argument">
<tr>
<td><xsl:value-of select="name" /></td>
<!--<td><xsl:value-of select="type" /></td>
<td><xsl:value-of select="default" /></td>
<td><xsl:value-of select="display-name" /></td>
<td><xsl:value-of select="descriptions" /></td>
<td><xsl:value-of select="visible" /></td>
<td><xsl:value-of select="filter-type" /></td>-->
</tr>
</xsl:for-each>
</table>
</xsl:template>
</xsl:stylesheet>
|
|
|
|
|
Your xsl:for-each executes in the scope of the current node, arguments. However, your XPath expression was designed to match a child arguments node of a parent arguments node:
<xsl:for-each select="arguments/argument"> It should be:
<xsl:for-each select="argument"> since the argument node is a child of the arguments node.
"We make a living by what we get, we make a life by what we give." --Winston Churchill
|
|
|
|
|
This is how I'd tend to write it - differences are:
- I've used CSS, rather than inline styles - my preference
- I've used the thead element for the header
- I've split up the templates a bit more - if you had more than one report-item-definition in an XML file, that would be useful Also, it makes the context node more obvious, so you don't get issues like the one you had that George pointed out previously.
- I've used <xsl:apply-templates select="argument"/> rather than <xsl:for-each select="..."> to output each row of the table. My feeling is that using apply-templates like this is probably better idiomatic XSL than using for-each
<?xml version="1.0" ?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" >
<xsl:template match ="/">
<html>
<style>
th { text-align: center }
thead { background-color: #cccccc }
h1 { text-align: center; font-weight: bold }
</style>
<head>
<title>XML Stylesheet</title>
</head>
<body>
<xsl:apply-templates select="report-item-definition"/>
</body>
</html>
</xsl:template>
<xsl:template match="report-item-definition">
<h1><xsl:value-of select="item-title" /></h1>
<xsl:apply-templates select="arguments"/>
</xsl:template>
<xsl:template match="arguments">
<table width="700" border="1" align="center" style="font-family:verdana font-size:10pt">
<thead>
<tr>
<th width="130"><b>Name</b></th>
<th><b>Type</b></th>
<th><b>Default</b></th>
<th><b>Display Name</b></th>
<th><b>Description</b></th>
<th><b>Visible</b></th>
<th><b>Filter Type</b></th>
</tr>
</thead>
<xsl:apply-templates select="argument"/>
</table>
</xsl:template>
<xsl:template match="argument">
<tr>
<td><xsl:value-of select="name" /></td>
<!--<td><xsl:value-of select="type" /></td>
<td><xsl:value-of select="default" /></td>
<td><xsl:value-of select="display-name" /></td>
<td><xsl:value-of select="descriptions" /></td>
<td><xsl:value-of select="visible" /></td>
<td><xsl:value-of select="filter-type" /></td>-->
</tr>
</xsl:template>
</xsl:stylesheet>
Java, Basic, who cares - it's all a bunch of tree-hugging hippy cr*p
|
|
|
|
|
Hi,
I am trying to serialize an object, I am getting exception as
"Unable to cast object Type A to Type B".
Please help me in finding soultion
Thanks,
Mini
Best Regards,
Mini Thomas
|
|
|
|
|
|
Howdy'
In one of our data XML files, we need to have attribute values preserve white space at the end.
For example :
<!-- without space -->
<MyTag MyAttribute="a value" />
<!-- with space -->
<MyTag MyAttribute="a value " />
Are two different attribute values.
I tried using the preserve white space attribute
pXMLDoc->preserveWhiteSpace = VARIANT_TRUE;
but that completely craps out the parsing of the file, for example, sometimes (well, always)
I get the wrong number of items in a node list (IXMLDOMNodeListPtr )
for example, in the following snippet, when preserveWhiteSpace is FALSE, the list count is 2 and when preserveWhiteSpace is TRUE, the list count if 5 (!)
<MESSAGE_LIST>
<MESSAGE Id="10" Type="Info">
<FRENCH>Message 10</FRENCH>
</MESSAGE>
<MESSAGE Id="11" Type="Info">
<FRENCH>Message 11</FRENCH>
</MESSAGE>
</MESSAGE_LIST>
Is there something I can do to MSXML to have the parsing behaviour that I want ? i.e. read significant spaces from an attribute value.
Thanks for any help, tips or hints.
Max.
This signature was proudly tested on animals.
|
|
|
|
|
Maximilien wrote: for example, in the following snippet, when preserveWhiteSpace is FALSE, the list count is 2 and when preserveWhiteSpace is TRUE, the list count if 5 (!)
That's because there are text nodes in the list - they're the manifestation of the whitespace that's been preserved from the source XML.
I'm not sure that the preserve whitespace option affects attribute values anyway...
Here's some quick test code I wrote that demonstrates correct whitespace handling in attribute values - the value of the arp attribute of the test element is correctly read with a trailing space:
#include "stdafx.h"
#import <progid:Msxml2.DOMDocument.6.0> named_guids
#include <iostream>
int _tmain(int argc, _TCHAR* argv[])
{
::CoInitialize(0);
MSXML2::IXMLDOMDocument3Ptr doc;
doc.CreateInstance(MSXML2::CLSID_DOMDocument60);
if (VARIANT_FALSE != doc->loadXML(_bstr_t(L"<test arp=\"test \">\n Hello!\n</test>")))
{
MSXML2::IXMLDOMNodeListPtr nodes = doc->childNodes;
MSXML2::IXMLDOMNodePtr thisNode = nodes->nextNode();
if (thisNode)
do
{
std::cout << thisNode->nodeTypeString << " - " << thisNode->text << std::endl;
MSXML2::IXMLDOMNamedNodeMapPtr attributes = thisNode->attributes;
{
MSXML2::IXMLDOMNodePtr thisAttribute = attributes->nextNode();
if (thisAttribute)
do
{
std::cout << " " << thisAttribute->nodeName << " - \"" << _bstr_t(thisAttribute->nodeValue) << "\"" << std::endl;
} while (thisAttribute = attributes->nextNode());
}
} while (thisNode = nodes->nextNode());
}
return 0;
}
Java, Basic, who cares - it's all a bunch of tree-hugging hippy cr*p
|
|
|
|
|
Thanks, I will look at your sample and report back.
---edit----
Yep, that works.
Thanks.
This signature was proudly tested on animals.
modified on Wednesday, June 10, 2009 9:52 AM
|
|
|
|
|
I am trying to format my html table as i have a field labeled description with multiple lines and i was wondering is there anyway to format them using a substring function, i would also like them with bullet points any help?
<field name="Description" index="description">
This is a test script designed to illustrate DDML features.
Read some data
View the data
Require some libraries (actually we don't, but it shows off some of the functionality)
Do some funky Emax model stuff ...
Sample code from <a href="http://www.e-booksdirectory.com/details.php?ebook=1791">An introduction to R</a>
</field>
Above is a samble of what i want, for each line i want ot use a substring to read each line stick it in a bullet point and move onto the next untill they are also done.
also i need to find away to carry over the link to the html table.
below is sample of my stylesheet.
<table width="700" border="1" align="center" style="font-family:verdana font-size:10pt">
<tr bgcolor = "#cccccc">
<td width="130" align="center"><b>Title</b></td>
<td align="center"><b>Information</b></td>
</tr>
<xsl:apply-templates/>
</table>
></xsl:template>
<xsl:template match="field">
<tr>
<td><xsl:value-of select="@name" /></td>
<td><xsl:value-of select="." /></td>
</tr>
</xsl:template>
</xsl:stylesheet>
I would appreicate any help possible, thank you
|
|
|
|
|
One thing I see a problem with immediately - the <a> tag won't be included in the text for <field> - it's a nested tag.
Aside form that, this is roughly what you need:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<xsl:apply-templates select="//field"/>
</xsl:template>
<!--
Template for a field element. Apply template for each of its text nodes.
-->
<xsl:template match="field">
<ul>
<xsl:apply-templates select="text()"/>
</ul>
</xsl:template>
<!--
Template for text() in a field element. Apply the line-splitting algorithm to the text
-->
<xsl:template match="/field/text()">
<xsl:call-template name="t">
<xsl:with-param name="s" select="."/>
</xsl:call-template>
</xsl:template>
<!--
Template t takes one string parameter s. It takes off the first line
then recurses, terminating when the input parameter is the empty string
-->
<xsl:template name="t">
<xsl:param name="s"/>
<!--
Is there any text to process?
-->
<xsl:if test="string-length($s)>0">
<!--
first = text before the first line break (or null if it's the last, unterminated line)
-->
<xsl:variable name="first" select="substring-before($s, '
')"/>
<xsl:choose>
<!--
Output first if it has content
-->
<xsl:when test="string-length($first)>0">
<li><xsl:value-of select="$first"/></li>
</xsl:when>
<xsl:otherwise>
<!--
Output the input string if it doesn't contain a line break
-->
<xsl:if test="substring($s,1,1)!='
'">
<li><xsl:value-of select="$s"/></li>
</xsl:if>
</xsl:otherwise>
</xsl:choose>
<!--
Recurse, passing in the text after the first line break
-->
<xsl:call-template name="t">
<xsl:with-param name="s" select="substring-after($s, '
')"/>
</xsl:call-template>
</xsl:if>
</xsl:template>
</xsl:stylesheet>
Java, Basic, who cares - it's all a bunch of tree-hugging hippy cr*p
|
|
|
|
|
--> can v apply CSS on XML sheet?
--> if ya den how?
J A Nasir K
|
|
|
|
|
This is a stupid question. Even if it was written in English, it would still be stupid. How is a plain XML document displayed, that it would interact with CSS ?
Christian Graus
Driven to the arms of OSX by Vista.
"! i don't exactly like or do programming and it only gives me a headache." - spotted in VB forums.
I can do things with my brain that I can't even google. I can flex the front part of my brain instantly anytime I want. It can be exhausting and it even causes me vision problems for some reason. - CaptainSeeSharp
|
|
|
|
|
Christian Graus wrote: How is a plain XML document displayed, that it would interact with CSS ?
Not such a stupid question, Christian - see this example[^]...
Java, Basic, who cares - it's all a bunch of tree-hugging hippy cr*p
|
|
|
|
|
OK, so the XML basically gets treated as XHTML ? I'd have expected to use XSLT to create that sort of a view.
Christian Graus
Driven to the arms of OSX by Vista.
"! i don't exactly like or do programming and it only gives me a headache." - spotted in VB forums.
I can do things with my brain that I can't even google. I can flex the front part of my brain instantly anytime I want. It can be exhausting and it even causes me vision problems for some reason. - CaptainSeeSharp
|
|
|
|
|
Christian Graus wrote: OK, so the XML basically gets treated as XHTML
Something like that - I guess each of the elements gets treated a bit like a DIV in HTML, i.e. no implied display semantics.
The 'original' stylesheet language was DSSSL, which was designed for use with SGML (ancestor of XML and HTML). Looking at this DSSSL sample[^], you can (kind of) see a resemblance to CSS. So, I guess there's a parallel link between SGML -> XML/XHTML/HTML on the one side and DSSSL -> CSS on t'other.
Java, Basic, who cares - it's all a bunch of tree-hugging hippy cr*p
|
|
|
|
|
Yes - see here[^]
Java, Basic, who cares - it's all a bunch of tree-hugging hippy cr*p
|
|
|
|
|
thanks alot sir...
J A Nasir K
|
|
|
|
|
Hi
I have 2 XML files. The one looks like the following at the top:
<?xml version="1.0" standalone="yes" ?>
- <NewDataSet>
And the other one as follows:
<?xml version="1.0" standalone="yes" ?>
- <dsParrys_offoice_furniture xmlns="http://tempuri.org/dsParrys_offoice_furniture.xsd">
I use the following in my XAML to bind to them:
<!--XmlDataProvider used to populate treeview-->
<XmlDataProvider x:Key="dpNewDS" XPath="*"/>
<!--ProductRange template-->
<HierarchicalDataTemplate DataType="ProductRange" ItemsSource="{Binding XPath=*}">
<WrapPanel>
<TextBlock Text="{Binding XPath=ProductRangeDesc}"/>
</WrapPanel>
</HierarchicalDataTemplate>
<!--Products template-->
<HierarchicalDataTemplate DataType="Products" ItemsSource ="{Binding XPath=Products}">
<WrapPanel>
<TextBlock Text="{Binding XPath=Product}"/>
</WrapPanel>
</HierarchicalDataTemplate>
As well as these lines in the code behind file:
NOTE: I specify the path to the XML files using an OpenFileDialog
System.Windows.Forms.OpenFileDialog ofd = new System.Windows.Forms.OpenFileDialog();
if (ofd.ShowDialog() == System.Windows.Forms.DialogResult.OK)
{
string fileName = ofd.FileName;
XmlDataProvider dp = this.FindResource("dpNewDS") as XmlDataProvider;
dp.Source = new Uri(fileName);
}
Now when I select the FIRST XML file my treeview binds fine, but when I select to the 2nd one (the one with the XMLNS defined), it does not bind correctly.
Is there something I should change in my XAML when binding to the 2nd XML file?
|
|
|
|
|
Don't say it's urgent. It's not, we really don't care. Did you cross post this, or did you fail to post it in the WPF forum ?
Christian Graus
Driven to the arms of OSX by Vista.
"! i don't exactly like or do programming and it only gives me a headache." - spotted in VB forums.
I can do things with my brain that I can't even google. I can flex the front part of my brain instantly anytime I want. It can be exhausting and it even causes me vision problems for some reason. - CaptainSeeSharp
|
|
|
|
|
If you don't have an answer to post, why bother to reply? Seriously. And don't refer to "we" when its just you replying, please.
This HAS got to do with XML by the way, as well as WPF. When I post this sort of question in the WPF forums I get told that I should post it in the XML forum, now when I post it here I get told I should post it in the WPF forum.
|
|
|
|
|
Well, I'm sorry that someone told you that, because it seems to me that it has to do with how WPF parses XML, not just XML. So, you'll have more luck in the WPF forum. And I suggest that entirely to try to help you find an answer.
I said 'we' because I'm referring to community standards. It's rude to tell us that your question is urgent. If you can't wait for a free answer, find a way to pay for one.
Christian Graus
Driven to the arms of OSX by Vista.
"! i don't exactly like or do programming and it only gives me a headache." - spotted in VB forums.
I can do things with my brain that I can't even google. I can flex the front part of my brain instantly anytime I want. It can be exhausting and it even causes me vision problems for some reason. - CaptainSeeSharp
|
|
|
|
|
Can you please specify the path for your XML files. So that we can look into it in broader way
|
|
|
|
|
Hi guys
I use the following to specify the Uri path for the XmlDataProvider dp:
System.Windows.Forms.OpenFileDialog ofd = new System.Windows.Forms.OpenFileDialog();
if (ofd.ShowDialog() == System.Windows.Forms.DialogResult.OK)
{
string fileName = ofd.FileName;
XmlDataProvider dp = this.FindResource("dpNewDS") as XmlDataProvider;
dp.Source = new Uri(fileName);
}
Now I want to now, what if I don't want to use an OpenFileDialog to specify the path, but instead I want to specify it myself. I know typing in the folder address e.g C:\xmlfile.xml works fine, but I don't want to hard code the path. I want to keep the file in the "bin" folder, how do I specify the path to this folder?
I tried various methods but none seemed to work.
|
|
|
|
|
Hi everybody
I recently got it working to bind an XML file to a treeview using a XmlDataProvider, but my problem is that my XML file does not contain attributes which can be easily bound to. Here's a sample of what my XML looks like:
<Product_x0020_range>
<Product_x0020_range_x0020_id>1</Product_x0020_range_x0020_id>
<Product_x0020_Range>Specials</Product_x0020_Range>
<Products>
<quote_x0020_id>270</quote_x0020_id>
<date>2008-10-14T00:00:00+02:00</date>
<x_x0020_hide_x0020_options_x0020_id>12</x_x0020_hide_x0020_options_x0020_id>
<Product_x0020_range_x0020_id>1</Product_x0020_range_x0020_id>
<Product>QQ CORE 2200 X 800 X 1500 X 600</Product>
<height>0</height>
<breadth_x002F_depth>0</breadth_x002F_depth>
<length_x002F_width>0</length_x002F_width>
<Description_x0020_1>CORE 2200 X 800 X 1500 X 600</Description_x0020_1>
<Description_x0020_2>CORE 2200 X 800 X 1500 X 600</Description_x0020_2>
<wood_x0020_options_x0020_1>1</wood_x0020_options_x0020_1>
<wood_x0020_options_x0020_2>2</wood_x0020_options_x0020_2>
<wood_x0020_options_x0020_3>3</wood_x0020_options_x0020_3>
<frozen_x0020_price>2030</frozen_x0020_price>
<Frozen_x0020_hours>1</Frozen_x0020_hours>
<Prepaired_x0020_for>GILLIAN</Prepaired_x0020_for>
<Percent_x0020_mark_x0020_up>2.5</Percent_x0020_mark_x0020_up>
<Price_x0020_list>false</Price_x0020_list>
</Products>
</Product_x0020_range>
As you can see, ProductRangeID and the ProductRange description are not specified as attributes, but instead as a values between 2 tags each.
The code I'm using in my XAML to bind these are as follows:
<HierarchicalDataTemplate DataType="Product_x0020_range" ItemsSource="{Binding XPath=*}">
<WrapPanel>
<TextBlock Text="{Binding Path=Name}"/>
</WrapPanel>
</HierarchicalDataTemplate>
<HierarchicalDataTemplate DataType="Products" ItemsSource ="{Binding XPath=*}">
<WrapPanel>
<TextBlock Text="{Binding XPath=Name}"/>
</WrapPanel>
</HierarchicalDataTemplate>
This does not give me the output I want though. It lists all the Product Ranges in the treeview, but it displays Product_x0020_range as the header for the root treeview items, then when I expand this item, it then displays the actual ID and description of the product range e.g. 1, Specials.
How can I do my bindings so that "Specials" is displayed as the header for the root treeview items?
|
|
|
|
|
So what I'm asking is, how do I bind to the text contained within XML elements, instead of attributes?
|
|
|
|