XML Editor
Sign up for a WebBoard account Sign Up Keyword Search Search More Options... Options
Chat Rooms Chat Help Help News News Log in to WebBoard Log in Not Logged in
Show tree view Topic
Go to previous topicPrev TopicGo to next topicNext Topic
Postnext
Jim ByrneSubject: Using row data to populate XMLELEMENT name
Author: Jim Byrne
Date: 25 Jan 2005 11:40 AM
I am trying to create an XMLElement name from the row data
within a SQL Server 2000 table or view? Can I use CONCAT, XMLAgg,
or is there another way to do this within DB to XML?

Postnext
Ivan PedruzziSubject: Using row data to populate XMLELEMENT name
Author: Ivan Pedruzzi
Date: 25 Jan 2005 02:17 PM
Hi Jim,
Use XMLCONCAT to concatenate 2 columns to one XML element.
Here is an example based on the "pub" database

SELECT
XMLELEMENT(name "row",
XMLCONCAT(t.title_id, '----',t.title)
)
FROM pubs.dbo.titles t

Hope this helps
Ivan


Postnext
Jim ByrneSubject: Using row data to populate XMLELEMENT name
Author: Jim Byrne
Date: 25 Jan 2005 02:55 PM
Hey Ivan,
I should have been a bit more precise. I need to derive the tag name if
possible?

SELECT
XMLELEMENT(name XMLCONCAT('"', t.title,'"'),t.comment)
FROM pubs.dbo.titles t

Assuming the t.title field value "Apple", and t.comment of "Hello".
XML produced:

<Apple>Hello</Apple>

Thanks again.

Postnext
Ivan PedruzziSubject: Using row data to populate XMLELEMENT name
Author: Ivan Pedruzzi
Date: 25 Jan 2005 05:40 PM
Jim

SQL/XML defines 3 functions for shaping XML, below you can see a query that use them

SELECT
XMLELEMENT(name "row",
XMLATTRIBUTES(t.title_id as "id"),
XMLELEMENT(name "title", t.title),
XMLFOREST(t.price, t.royalty)
)
FROM pubs.dbo.titles t


By design SQL/XML does not allow to create elements/attributes using the column value.

Element/Attribute names (QName) have a set of rules (http://www.w3.org/TR/REC-xml-names/);
if you could freely map column values to name you could end up with invalid XML.

Are you sure you need a so highly unstructured result?

If you are sure that the values do not violate QName restrictions you could post process the query result using XSLT.

Here the steps:

- Create new DB to XML Data Source
- Fill the server info to access the SQLServer sample database "pub"
- Type the following query

SELECT
XMLELEMENT(name "row",
XMLELEMENT(name "title_id",t.title_id),
XMLELEMENT(name "title",t.title)
)
FROM pubs.dbo.titles t


- Execute the query; you should see a similar result

<?xml version='1.0' encoding='UTF-8'?>
<root>
<row><title_id>PC1035</title_id><title>But Is It User Friendly?</title></row>
...
</root>


- File -> save as mydb.rdbxml

- File -> New XSLT: Text Editor

- Choose db:///mydb.rdbxml as Source XML

- Type the following XSLT code

<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="/">
<root>
<xsl:for-each select="root/row">
<xsl:element name="{title_id}">
<xsl:value-of select="title"/>
</xsl:element>
</xsl:for-each>
</root>
</xsl:template>
</xsl:stylesheet>

When executing you should see

<?xml version='1.0' ?>
<root>
<PC1035>But Is It User Friendly?</PC1035>
...
</root>

Hope this helps
Ivan

Postnext
Jim ByrneSubject: Using row data to populate XMLELEMENT name
Author: Jim Byrne
Date: 26 Jan 2005 11:14 AM
Ivan

Unfortunately the highly unstructured result is due to adherence to a
very strict tiered development protocol whereby I have access to data
but not the resulting database structure or application code.

I must adhere to an XML schema that contains approximately 100
"optional" tags of which exactly none or 1 must be present for each
master record. I had hoped to solve this without any post XSLT
processing, mostly due to lack of experience with it. But since we're
into the XSLT code, I think the code you provided will work very nicely
and I'll report back with results.

One alternative, if you don't mind a final follow-up, was conditional
processing within the DB to XML template to only build the tag if a
condition matched the field data value for the row. I don't see any
conditional processing capabilities within DB to XML? Am I missing
something? Is this a possible new feature candidate?

If not, then I was thinking I would just build all 100 tags for each
record and then use "if" or "choose" conditional processing within
XSLT to remove the empty tags? This of course requires considerable work
building numerous tags that will ultimately be dropped. Any thoughts
on making this alternative more efficient?

Thanks!

Postnext
Ivan PedruzziSubject: Using row data to populate XMLELEMENT name
Author: Ivan Pedruzzi
Date: 26 Jan 2005 11:40 AM
>One alternative, if you don't
>mind a final follow-up, was
>conditional
>processing within the DB to
>XML template to only build the
>tag if a
>condition matched the field
>data value for the row. I
>don't see any


You could use WHERE to filter out rows where the field
you are interested is NULL.
The following query removes 2 rows (MC3026, PC9999) because the field royalty is NULL

SELECT
XMLELEMENT(name "row",
XMLELEMENT(name "title_id",t.title_id),
XMLELEMENT(name "title",t.title)
)
FROM pubs.dbo.titles t
WHERE NOT T.royalty IS NULL




>

Posttop
Jim ByrneSubject: Using row data to populate XMLELEMENT name
Author: Jim Byrne
Date: 26 Jan 2005 01:53 PM
Ivan,

Thanks for all the assistance. The XSLT solution worked great, I won't
shy away from this powerfull but as yet unexplored territory in the
future. Your most recent comment, however, hinted at a subquery that
worked perfect. When the condition is not met, the entire tag and
underlying subtags are not written to the XML file. I included the
following excerpt in hopes it will provide someone with a similar
problem a bit of assistance.

SELECT
XMLELEMENT(name "Employee",
XMLATTRIBUTES(t.GlobalEmpID As "EmployeeID",
t.ActLevel As "ActivityLevel",
t.RegDate As "RegistrationDate"),
XMLELEMENT(name "Registrations",
XMLELEMENT(name "Registration",
XMLATTRIBUTES(t.ContDate As "ContactDate",
t.RegDate AS "RegistrationDate",
t.GlobalRegID As "RegistrationID"),
XMLELEMENT(name "ResponseElement",
XMLELEMENT(name "LastName",
XMLELEMENT(name "ResponseTxt",t.LastName)
)
),
XMLELEMENT(name "ResponseElement",
XMLELEMENT(name "FirstName",
XMLELEMENT(name "ResponseTxt",t.FirstName)
)
),
(Select
XMLELEMENT(name "Condition1",
XMLELEMENT(name "ConditionComment",t.CondComment),
XMLELEMENT(name "ClassDescription")
)
From CompData.dbo.XML_EmpData c1
Where c1.joinid=t.joinid And t.Cond = 'Condition1'
),
(Select
XMLELEMENT(name "Condition2",
XMLELEMENT(name "ConditionComment",t.CondComment),
XMLELEMENT(name "ClassDescription")
)
From CompData.dbo.XML_ EmpData c2
Where c2.joinid =t.joinid And t. Cond = 'Condition2'
),
XMLELEMENT(name "ResponseElement",
XMLELEMENT(name "EmpID",
XMLELEMENT(name "ResponseTxt",t.EmpID)
)
)
)
)
)
FROM CompData.dbo.XML_ EmpData t

Much appreciated once again...Jim

 
Go to previous topicPrev TopicGo to next topicNext Topic
Download A Free Trial of Stylus Studio 6 XML Professional Edition Today! Powered by Stylus Studio, the world's leading XML IDE for XML, XSLT, XQuery, XML Schema, DTD, XPath, WSDL, XHTML, SQL/XML, and XML Mapping!  
go

Log In Options

Site Map | Privacy Policy | Terms of Use | Trademarks
Stylus Scoop XML Newsletter:
W3C Member
Stylus Studio® and DataDirect XQuery ™are from DataDirect Technologies, is a registered trademark of Progress Software Corporation, in the U.S. and other countries. © 2004-2016 All Rights Reserved.