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
Conferences Close Tree View
+ Stylus Studio Feature Requests (1192)
+ Stylus Studio Technical Forum (14621)
+ Website Feedback (249)
- XSLT Help and Discussion (7625)
-> + Use of before and after string (3) Sticky Topic
-> - How do I substitute element ty... (1)
-> + How does one add working days ... (4)
-> - Help, I have existing XLT and... (1)
-> + Need help on XSLT issue - (2)
-> + EDI to XML Conversion (7)
-> - XML To JSON Conversion using X... (1)
-> + Formatting Paragraphs to same ... (2)
-> - Grouping of records (1)
-> + Problems with xsd 1.1 (4)
-> + XML to HL7 mapping (3)
-> + XSLT 3 and Iterate (2)
-> + XSL-FO to PDF preview (3)
-> + java.lang.RuntimeException: Er... (2)
-> + Create Acroforms with Stylus X... (2)
-> + How to change XSLT parameter s... (3)
-> + how to change format of the da... (2)
-> + Search "Next 8 Results " doesn... (2)
-> - Support for Git (1)
-> + newbee (8)
-- [1-20] [21-40] [41-60] Next
+ XQuery Help and Discussion (2017)
+ Stylus Studio FAQs (159)
+ Stylus Studio Code Samples & Utilities (364)
+ Stylus Studio Announcements (113)
Topic  
Postnext
Ramon AldanaSubject: XSLT: Traversing XML twice for XML + Text outputs
Author: Ramon Aldana
Date: 10 Jan 2008 10:56 PM
Hello,

I have both routines to traverse an XML and generate a true XML copy + a string concatenation as follows.

To get true XML copy of input document:

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

To get string concatenation

<xsl:template match="/" >
<xsl:for-each select="procedure/parameters/attributes">
<xsl:if test="position()!=1">,</xsl:if>
@<xsl:value-of select="@name"/> <xsl:value-of select="@type"/> <xsl:if test="@required='No'">= NULL</xsl:if>
</xsl:for-each>
</xsl:template>


The problem is that I need the TEXT generated in the second xsl:template at the bottom of the XML generated by the first xsl:template.


Thanks.

Postnext
(Deleted User) Subject: XSLT: Traversing XML twice for XML + Text outputs
Author: (Deleted User)
Date: 11 Jan 2008 09:35 AM
Hi Ramon,
have you tried merging the two templates into one, one after the other?

Alberto

Posttop
Ramon AldanaSubject: XSLT: Traversing XML twice for XML + Text outputs
Author: Ramon Aldana
Date: 11 Jan 2008 01:59 PM
Thanks for you reply.

Yes, what I find is that inside...

Somehow as I was trying to repro what I did that didn't work according to your sugestion, it sudenly worked.

I believe my problem was that the initial: <xsl:template match="/" > was match-ing "*|@*" which then was doing the traversal for each single element/attribute and it was giving me duplicates all over the place.

Thanks.

For future knowledge here is what I did:

XML:
<procedure name="Reader.GetComponentById" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="C:\Users\rborjes\Documents\SD\whos\Databases\Procedures.xsd">
<scope>Public</scope>
<summary>Get a single component by Id</summary>
<parameters>
<attributes type="Int" required="yes" description="Component Id" name="ComponentId"/>
</parameters>
<returns>
<recordset>
<column datatype="varchar(300)" description="Component Name" name="name"/>
<column datatype="varchar(4000)" description="Description" name="description"/>
<column datatype="Int" description="Component Central Id" name="CompCentralId"/>
<column datatype="Int" description="Product Id" name="ProductId"/>
<column datatype="Int" description="Type Id" name="TypeId"/>
<column datatype="Int" description="Group Id" name="GroupId"/>
<column datatype="Int" description="Phase Id" name="PhaseId"/>
<column datatype="nvarchar(30)" description="Product Manager Owner" name="PMOwner"/>
<column datatype="nvarchar(30)" description="Developer Owner" name="DevOwner"/>
<column datatype="nvarchar(30)" description="Test Owner" name="TestOwner"/>
<column datatype="varchar(4000)" description="Comments" name="Comments"/>
</recordset>
<return description="General Error" value="1"/>
<return description="Success" value="0"/>
</returns>
<sample>
<description/>
<code/>
</sample>
</procedure>


XSLT:
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:fn="http://www.w3.org/2005/xpath-functions">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes" omit-xml-declaration="yes"/>





<xsl:template match="/" >
<xsl:copy><xsl:copy-of select="*|@*"/><xsl:apply-templates/></xsl:copy>
CREATE procedure <xsl:value-of select="procedure/@name"/>
<xsl:for-each select="procedure/parameters/attributes">
<xsl:if test="position()!=1">,</xsl:if>
@<xsl:value-of select="@name"/><xsl:text> </xsl:text><xsl:value-of select="@type"/> <xsl:if test="@default !='' "> = <xsl:value-of select="@default"/></xsl:if>
</xsl:for-each>
WITH EXECUTE AS CALLER AS BEGIN


SELECT <xsl:for-each select="procedure/returns/recordset/column"><xsl:if test="position()!=1">,</xsl:if>CAST(0 AS <xsl:value-of select="@datatype"/>) AS <xsl:value-of select="@name"/></xsl:for-each>

</xsl:template>


</xsl:stylesheet>


OUTPUT:
<procedure xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" name="Reader.GetComponentById" xsi:noNamespaceSchemaLocation="C:\Users\rborjes\Documents\SD\whos\Databases\Procedures.xsd"> <scope>Public</scope>
<summary>Get a single component by Id</summary>
<parameters>
<attributes type="Int" required="yes" description="Component Id" name="ComponentId"/>
</parameters>
<returns>
<recordset>
<column datatype="varchar(300)" description="Component Name" name="name"/>
<column datatype="varchar(4000)" description="Description" name="description"/>
<column datatype="Int" description="Component Central Id" name="CompCentralId"/>
<column datatype="Int" description="Product Id" name="ProductId"/>
<column datatype="Int" description="Type Id" name="TypeId"/>
<column datatype="Int" description="Group Id" name="GroupId"/>
<column datatype="Int" description="Phase Id" name="PhaseId"/>
<column datatype="nvarchar(30)" description="Product Manager Owner" name="PMOwner"/>
<column datatype="nvarchar(30)" description="Developer Owner" name="DevOwner"/>
<column datatype="nvarchar(30)" description="Test Owner" name="TestOwner"/>
<column datatype="varchar(4000)" description="Comments" name="Comments"/>
</recordset>
<return description="General Error" value="1"/>
<return description="Success" value="0"/>
</returns>
<sample>
<description/>
<code/>
</sample>
</procedure>PublicGet a single component by Id
CREATE procedure Reader.GetComponentById
@ComponentId Int
WITH EXECUTE AS CALLER AS BEGIN


SELECT CAST(0 AS varchar(300)) AS name,CAST(0 AS varchar(4000)) AS description,CAST(0 AS Int) AS CompCentralId,CAST(0 AS Int) AS ProductId,CAST(0 AS Int) AS TypeId,CAST(0 AS Int) AS GroupId,CAST(0 AS Int) AS PhaseId,CAST(0 AS nvarchar(30)) AS PMOwner,CAST(0 AS nvarchar(30)) AS DevOwner,CAST(0 AS nvarchar(30)) AS TestOwner,CAST(0 AS varchar(4000)) AS Comments










   
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.