|
top
|
Subject: 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
|
|
|