L
Larry Coon
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">syb0201</column>
<column colname="physical" colnum="2">/dev/rlv0201</column>
<column colname="dbname" colnum="3">curric_prod</column>
<column colname="segname" colnum="4">index</column>
<column colname="mbytes" colnum="5">500</column>
</row>
<row>
<column colname="device" colnum="1">syb0201</column>
<column colname="physical" colnum="2">/dev/rlv0201</column>
<column colname="dbname" colnum="3">reports_prod</column>
<column colname="segname" colnum="4">system</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">syb0201</column>
<physical colnum="2">/dev/rlv0201</column>
<dbname colnum="3">curric_prod</column>
<segname colnum="4">index</column>
<mbytes colnum="5">500</column>
</row>
<row>
<device colnum="1">syb0201</column>
<physical colnum="2">/dev/rlv0201</column>
<dbname colnum="3">reports_prod</column>
<segname colnum="4">system</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:stylesheet 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:attribute 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:attribute 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
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">syb0201</column>
<column colname="physical" colnum="2">/dev/rlv0201</column>
<column colname="dbname" colnum="3">curric_prod</column>
<column colname="segname" colnum="4">index</column>
<column colname="mbytes" colnum="5">500</column>
</row>
<row>
<column colname="device" colnum="1">syb0201</column>
<column colname="physical" colnum="2">/dev/rlv0201</column>
<column colname="dbname" colnum="3">reports_prod</column>
<column colname="segname" colnum="4">system</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">syb0201</column>
<physical colnum="2">/dev/rlv0201</column>
<dbname colnum="3">curric_prod</column>
<segname colnum="4">index</column>
<mbytes colnum="5">500</column>
</row>
<row>
<device colnum="1">syb0201</column>
<physical colnum="2">/dev/rlv0201</column>
<dbname colnum="3">reports_prod</column>
<segname colnum="4">system</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:stylesheet 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:attribute 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:attribute 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