473,805 Members | 2,034 Online
Bytes | Software Development & Data Engineering Community
+ Post

Home Posts Topics Members FAQ

Need xsl help

I'm trying to use xsl for the first time, and as with
any first-time attempt, I'm running into problems.

I'm trying to transform an XML document into another
XML document with a slightly different format. Here's
an example of what the source XML looks like:

- - - - begin source.xml - - - -

<?xml version="1.0" encoding="UTF-8"?>

<result>
<row>
<column colname="device " colnum="1">syb0 201</column>
<column colname="physic al" colnum="2">/dev/rlv0201</column>
<column colname="dbname " colnum="3">curr ic_prod</column>
<column colname="segnam e" colnum="4">inde x</column>
<column colname="mbytes " colnum="5">500</column>
</row>
<row>
<column colname="device " colnum="1">syb0 201</column>
<column colname="physic al" colnum="2">/dev/rlv0201</column>
<column colname="dbname " colnum="3">repo rts_prod</column>
<column colname="segnam e" colnum="4">syst em</column>
<column colname="mbytes " colnum="5">300</column>
</row>
</result>

- - - - end of source.xml - - - -

(There are many more <row> elements, omitted for this example.

Here's what I want the target to look like:

- - - - target.xml - - - -

<?xml version="1.0" encoding="UTF-8"?>

<result>
<row>
<device colnum="1">syb0 201</column>
<physical colnum="2">/dev/rlv0201</column>
<dbname colnum="3">curr ic_prod</column>
<segname colnum="4">inde x</column>
<mbytes colnum="5">500</column>
</row>
<row>
<device colnum="1">syb0 201</column>
<physical colnum="2">/dev/rlv0201</column>
<dbname colnum="3">repo rts_prod</column>
<segname colnum="4">syst em</column>
<mbytes colnum="5">300</column>
</row>
</result>

- - - - end of target.xml - - - -

Here's the xsl I tried using:

- - - - begin transform.xsl - - - -

<?xml version="1.0"?>

<xsl:styleshe et version = "1.0"
xmlns:xsl = "http://www.w3.org/1999/XSL/Transform">

<xsl:template match = "/">
<xsl:apply-templates/>
</xsl:template>

<xsl:template match = "result">
<result>
<xsl:apply-templates/>
</result>
</xsl:template>

<xsl:template match = "row">
<row>
<xsl:apply-templates/>
</row>
</xsl:template>

<xsl:template match = "column">
<xsl:element name = "@colname">
<xsl:attribut e name = "colnum">
<xsl:value-of select = "@colnum"/>
</xsl:attribute>

<xsl:template match = "text()">
<xsl:value-of select = "."/>
</xsl:template>
</xsl:element>
</xsl:template>
</xsl:stylesheet>

- - - - end transform.xsl - - - -

When I apply the transform, it generates the <result> and <row>
elements just fine, but it doesn't generate the elements for the
columns. I thought that this:

<xsl:template match = "column">
<xsl:element name = "@colname">
<xsl:attribut e name = "colnum">
<xsl:value-of select = "colnum"/>
</xsl:attribute>

would match a <column> element in the source, create a new
element in the target where the name of the new element is
the value of the colname attribute, and the colnum attribute
is copied verbatim. But when I apply the transform, I get
stderr output:

Compiler warnings:
file:///C:/java/transform.xsl: line 25: You
cannot call an element '@colname'

And my output file looks like this:

- - - - begin out.xml - - - -

<?xml version="1.0" encoding="UTF-8"?><result>

<row>
syb0201
/dev/rlv0201
curric_prod
index
500
</row>
<row>
syb0201
/dev/rlv0201
reports_prod
system
300
</row>
</result>

- - - - end of out.xml - - - -

So it never creates the structure for the column element
(although it does copy the text inside the element correctly).
I don't understand the error "You cannot call an element
@colname," since as I understand it, this simply selects the
value of the colname attribute (right?).

If anybody more familiar with xsl than I can point me in the
right direction, I'd appreciate it.
Larry Coon
University of California
Dec 13 '05 #1
8 1380
Larry Coon wrote:

Follow-up: I think I found my own answer. Rather than:

<xsl:element name = "@colname">

I needed:

<xsl:element name = "{@colname} ">
Larry Coon
University of California
Dec 13 '05 #2
"Larry Coon" <lc******@assis t.org> wrote in message
news:43******** ***@assist.org. ..
- - - - begin source.xml - - - -

<?xml version="1.0" encoding="UTF-8"?>

<result>
<row>
<column colname="device " colnum="1">syb0 201</column>
<column colname="physic al" colnum="2">/dev/rlv0201</column>
<column colname="dbname " colnum="3">curr ic_prod</column>
<column colname="segnam e" colnum="4">inde x</column>
<column colname="mbytes " colnum="5">500</column>
</row>
<row>
<column colname="device " colnum="1">syb0 201</column>
<column colname="physic al" colnum="2">/dev/rlv0201</column>
<column colname="dbname " colnum="3">repo rts_prod</column>
<column colname="segnam e" colnum="4">syst em</column>
<column colname="mbytes " colnum="5">300</column>
</row>
</result>

- - - - end of source.xml - - - -
- - - - target.xml - - - -

<?xml version="1.0" encoding="UTF-8"?>

<result>
<row>
<device colnum="1">syb0 201</column>
<physical colnum="2">/dev/rlv0201</column>
<dbname colnum="3">curr ic_prod</column>
<segname colnum="4">inde x</column>
<mbytes colnum="5">500</column>
</row>
<row>
<device colnum="1">syb0 201</column>
<physical colnum="2">/dev/rlv0201</column>
<dbname colnum="3">repo rts_prod</column>
<segname colnum="4">syst em</column>
<mbytes colnum="5">300</column>
</row>
</result>

- - - - end of target.xml - - - -


Using an identity transform:

--begin--

<?xml version="1.0" encoding="iso-8859-1" ?>
<xsl:transfor m version="1.0"
xmlns:xsl="http ://www.w3.org/1999/XSL/Transform">

<xsl:template match="@*|node( )">
<xsl:copy>
<xsl:apply-templates select="@*|node ()"/>
</xsl:copy>
</xsl:template>

<xsl:template match="column">
<xsl:element name="{@colname }">
<xsl:apply-templates select="@*|node ()"/>
</xsl:element>
</xsl:template>

<xsl:template match="@colname "/>

</xsl:transform>

--end--

// Magnus
Dec 14 '05 #3
Magnus Henriksson wrote:
Using an identity transform:


(rest snipped)

Thanks!

I'm now trying to figure out how to copy a comment node from the
source document to the target document.

I know I have to use <xsl:comment> , but I don't see how to select
the comments from the source document. Can you point me the right
direction?
Larry Coon
University of California
Dec 15 '05 #4
Magnus Henriksson wrote:
Using an identity transform:


One more question, if I may....what's the correct way to add newlines
to the result document? I'm getting output that looks like:

<result><row><c olumn> . . .

and I want:

<result>
<row>
<column> . . .

or at least:

<result>
<row>
<column> . . .

I played with inserting:

<xsl:text> </xsl:text>

which sort of did what I want, but not reliably. Is there
a better way to accomplish this? Thanks.
Larry Coon
University of California
Dec 15 '05 #5
Larry Coon wrote:
I don't see how to select
the comments from the source document.


Have a look at the XPath specification
(<http://www.w3.org/TR/xpath#NT-NodeType>):

comment()
--
Johannes Koch
Spem in alium nunquam habui praeter in te, Deus Israel.
(Thomas Tallis, 40-part motet)
Dec 15 '05 #6
Larry Coon wrote:
Magnus Henriksson wrote:
Using an identity transform:


(rest snipped)

Thanks!

I'm now trying to figure out how to copy a comment node from the
source document to the target document.

I know I have to use <xsl:comment> , but I don't see how to select
the comments from the source document. Can you point me the right
direction?


<xsl:template match="comment( )">
<xsl:copy/>
</xsl:template>

///Peter
--
XML FAQ: http://xml.silmaril.ie/

Dec 16 '05 #7
"Larry Coon" <lc******@assis t.org> wrote in message
news:43******** ***@assist.org. ..
One more question, if I may....what's the correct way to add newlines
to the result document? I'm getting output that looks like:

<result><row><c olumn> . . .

and I want:

<result>
<row>
<column> . . .


This can be controlled with <xsl:output indent="yes"/> (see
http://www.w3.org/TR/xslt#output).

The implementation of this instruction depends on the vendor, so using
different XSLT processors may result in different indentations (or none at
all). I would also caution against pretty printing the result tree, as it
may lead to unforeseen problems (after all, whitespace is significant in
XML).

If you want pretty printed results (for e.g. debugging purposes) you can do
something like this: In your production stylesheet, set <xsl:output
indent="no"/>. Then create a second (pretty printing) stylesheet that
imports your production stylesheet (<xsl:import href="productio n.xsl"/>. The
pretty printing stylesheet should then set <xsl:output indent="yes"/>.

Because of the import precedence rules, the <xsl:output/> element in the
imported stylesheet has lower precedence.

Something like this:

--production.xsl-

<?xml version="1.0" encoding="UTF-8"?>
<xsl:transfor m version="1.0"
xmlns:xsl="http ://www.w3.org/1999/XSL/Transform">

<xsl:output indent="no"/>

...

</xsl:transform>
--pretty-production.xsl--

<?xml version="1.0" encoding="UTF-8"?>
<xsl:transfor m version="1.0"
xmlns:xsl="http ://www.w3.org/1999/XSL/Transform">

<xsl:import href="productio n.xsl"/>

<xsl:output indent="yes"/>

</xsl:transform>
// Magnus
Dec 16 '05 #8
Magnus Henriksson wrote:

(snipped)

Thanks Magnus & Johannes for your help. My output is
looking the way I want it to now.
Larry Coon
University of California
Dec 16 '05 #9

This thread has been closed and replies have been disabled. Please start a new discussion.

Similar topics

6
6332
by: mike | last post by:
Hello, After trying to validate this page for a couple of days now I was wondering if someone might be able to help me out. Below is a list of snippets where I am having the errors. 1. Line 334, column 13: there is no attribute "SRC" <bgsound src="C:\My Documents\zingwent.mids"> You have used the attribute named above in your document, but the document type you are using does not support that attribute for this element. This error is...
5
2198
by: John Flynn | last post by:
hi all i'm going to be quick i have an assignment due which i have no idea how to do. i work full time so i dont have the time to learn it and its due date has crept up on me .. As follows: Objectives The purpose of this assignment is to have you practice the design of object-oriented classes, including one or more of the following concepts
0
1842
by: xunling | last post by:
i have a question about answering ..... this topic is "need help" what do i have to write at te topic line, !after i have klicked the "answer message" button ive tried many possibilities, all dont work "Re:" need help "Re:need help"
9
2942
by: sk | last post by:
I have an applicaton in which I collect data for different parameters for a set of devices. The data are entered into a single table, each set of name, value pairs time-stamped and associated with a device. The definition of the table is as follows: CREATE TABLE devicedata ( device_id int NOT NULL REFERENCES devices(id), -- id in the device
7
3312
by: Timothy Shih | last post by:
Hi, I am trying to figure out how to use unmanaged code using P/Invoke. I wrote a simple function which takes in 2 buffers (one a byte buffer, one a char buffer) and copies the contents of the byte buffer into the character pointer. The code looks like the following: #include <stdio.h> #include <stdlib.h> #include "stdafx.h" BOOL APIENTRY DllMain( HANDLE hModule, DWORD ul_reason_for_call,
15
4651
by: Cheryl Langdon | last post by:
Hello everyone, This is my first attempt at getting help in this manner. Please forgive me if this is an inappropriate request. I suddenly find myself in urgent need of instruction on how to communicate with a MySQL database table on a web server, from inside of my company's Access-VBA application. I know VBA pretty well but have never before needed to do this HTTP/XML/MySQL type functions.
16
2545
by: pamelafluente | last post by:
I am still working with no success on that client/server problem. I need your help. I will submit simplified versions of my problem so we can see clearly what is going on. My model: A client uses IE to talk with a server. The user on the client (IE) sees an ASP net page containing a TextBox. He can write some text in this text box and push a submit button.
8
2756
by: skumar434 | last post by:
i need to store the data from a data base in to structure .............the problem is like this ....suppose there is a data base which stores the sequence no and item type etc ...but i need only the sequence nos and it should be such that i can access it through the structure .plz help me .
0
3969
by: U S Contractors Offering Service A Non-profit | last post by:
Brilliant technology helping those most in need Inbox Reply U S Contractors Offering Service A Non-profit show details 10:37 pm (1 hour ago) Brilliant technology helping those most in need Inbox Reply from Craig Somerford <uscos@2barter.net> hide details 10:25 pm (3 minutes ago)
20
4312
by: mike | last post by:
I help manage a large web site, one that has over 600 html pages... It's a reference site for ham radio folks and as an example, one page indexes over 1.8 gb of on-line PDF documents. The site is structured as an upside-down tree, and (if I remember correctly) never more than 4 levels. The site basically grew (like the creeping black blob) ... all the pages were created in Notepad over the last
0
9716
marktang
by: marktang | last post by:
ONU (Optical Network Unit) is one of the key components for providing high-speed Internet services. Its primary function is to act as an endpoint device located at the user's premises. However, people are often confused as to whether an ONU can Work As a Router. In this blog post, we’ll explore What is ONU, What Is Router, ONU & Router’s main usage, and What is the difference between ONU and Router. Let’s take a closer look ! Part I. Meaning of...
0
9596
by: Hystou | last post by:
Most computers default to English, but sometimes we require a different language, especially when relocating. Forgot to request a specific language before your computer shipped? No problem! You can effortlessly switch the default language on Windows 10 without reinstalling. I'll walk you through it. First, let's disable language synchronization. With a Microsoft account, language settings sync across devices. To prevent any complications,...
0
10604
Oralloy
by: Oralloy | last post by:
Hello folks, I am unable to find appropriate documentation on the type promotion of bit-fields when using the generalised comparison operator "<=>". The problem is that using the GNU compilers, it seems that the internal comparison operator "<=>" tries to promote arguments from unsigned to signed. This is as boiled down as I can make it. Here is my compilation command: g++-12 -std=c++20 -Wnarrowing bit_field.cpp Here is the code in...
0
10103
tracyyun
by: tracyyun | last post by:
Dear forum friends, With the development of smart home technology, a variety of wireless communication protocols have appeared on the market, such as Zigbee, Z-Wave, Wi-Fi, Bluetooth, etc. Each protocol has its own unique characteristics and advantages, but as a user who is planning to build a smart home system, I am a bit confused by the choice of these technologies. I'm particularly interested in Zigbee because I've heard it does some...
1
7644
isladogs
by: isladogs | last post by:
The next Access Europe User Group meeting will be on Wednesday 1 May 2024 starting at 18:00 UK time (6PM UTC+1) and finishing by 19:30 (7.30PM). In this session, we are pleased to welcome a new presenter, Adolph Dupré who will be discussing some powerful techniques for using class modules. He will explain when you may want to use classes instead of User Defined Types (UDT). For example, to manage the data in unbound forms. Adolph will...
0
6874
by: conductexam | last post by:
I have .net C# application in which I am extracting data from word file and save it in database particularly. To store word all data as it is I am converting the whole word file firstly in HTML and then checking html paragraph one by one. At the time of converting from word file to html my equations which are in the word document file was convert into image. Globals.ThisAddIn.Application.ActiveDocument.Select();...
0
5536
by: TSSRALBI | last post by:
Hello I'm a network technician in training and I need your help. I am currently learning how to create and manage the different types of VPNs and I have a question about LAN-to-LAN VPNs. The last exercise I practiced was to create a LAN-to-LAN VPN between two Pfsense firewalls, by using IPSEC protocols. I succeeded, with both firewalls in the same network. But I'm wondering if it's possible to do the same thing, with 2 Pfsense firewalls...
1
4316
by: 6302768590 | last post by:
Hai team i want code for transfer the data from one system to another through IP address by using C# our system has to for every 5mins then we have to update the data what the data is updated we have to send another system
2
3839
muto222
by: muto222 | last post by:
How can i add a mobile payment intergratation into php mysql website.

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.