I'm new to XSL and having difficulty in understanding how/when patterns match/process. I understand that it is declarative, not procedural, and am at the disadvantage of trying to process XML -> XML, not XML -> HTML (which is what all the tutorials appear to show). In essence I want to sort a subtree of my XML file (which is a Visual studio document). In the subtree I want to sort the sibilngs by an attribute. A truncated sample of the file is:
<?xml version="1.0"?><SqlWorkbenchSqlProject xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" Name="PMISQL"><Items><LogicalFolder Name="Connections" Type="2" Sorted="true"><Items><ConnectionNode Name="cerberus:XPOOLE\alistair.moreton"><Created>2013-06-28T15:50:27.919788+01:00</Created><Type>SQL</Type><Server>cerberus</Server><UserName /><Authentication>Windows Authentication</Authentication><InitialDB>master</InitialDB><LoginTimeout>15</LoginTimeout><ExecutionTimeout>0</ExecutionTimeout><ConnectionProtocol>NotSpecified</ConnectionProtocol><ApplicationName>Microsoft SQL Server Management Studio - Query</ApplicationName></ConnectionNode><ConnectionNode Name="hector:XPOOLE\alistair.moreton"><Created>2013-07-02T15:27:02.5793203+01:00</Created><Type>SQL</Type><Server>hector</Server><UserName /><Authentication>Windows Authentication</Authentication><InitialDB /><LoginTimeout>15</LoginTimeout><ExecutionTimeout>0</ExecutionTimeout><ConnectionProtocol>NotSpecified</ConnectionProtocol><ApplicationName>Microsoft SQL Server Management Studio - Query</ApplicationName></ConnectionNode></Items></LogicalFolder><LogicalFolder Name="Queries" Type="0" Sorted="true"><Items><FileNode Name="PMI001_AddressHistory.sql"><AssociatedConnectionMoniker>8c91a03d-f9b4-46c0-a305-b5dcc79ff907:cerberus:True</AssociatedConnectionMoniker><AssociatedConnSrvName>cerberus</AssociatedConnSrvName><AssociatedConnUserName /><FullPath>PMI001_AddressHistory.sql</FullPath></FileNode><FileNode Name="PMI000_DataWarehouseState.sql"><AssociatedConnectionMoniker>8c91a03d-f9b4-46c0-a305-b5dcc79ff907:hector:True</AssociatedConnectionMoniker><AssociatedConnSrvName>hector</AssociatedConnSrvName><AssociatedConnUserName /><FullPath>PMI000_DataWarehouseState.sql</FullPath></FileNode><FileNode Name="PMI003_PlannedAdmissions.sql"><AssociatedConnectionMoniker>8c91a03d-f9b4-46c0-a305-b5dcc79ff907:cerberus:True</AssociatedConnectionMoniker><AssociatedConnSrvName>cerberus</AssociatedConnSrvName><AssociatedConnUserName /><FullPath>PMI003_PlannedAdmissions.sql</FullPath></FileNode><FileNode Name="PMI004_AllActivity.sql"><AssociatedConnectionMoniker>8c91a03d-f9b4-46c0-a305-b5dcc79ff907:cerberus:True</AssociatedConnectionMoniker><AssociatedConnSrvName>cerberus</AssociatedConnSrvName><AssociatedConnUserName /><FullPath>PMI004_AllActivity.sql</FullPath></FileNode><FileNode Name="PMI002_ClinicCodes.sql"><AssociatedConnectionMoniker>8c91a03d-f9b4-46c0-a305-b5dcc79ff907:cerberus:True</AssociatedConnectionMoniker><AssociatedConnSrvName>cerberus</AssociatedConnSrvName><AssociatedConnUserName /><FullPath>PMI002_ClinicCodes.sql</FullPath></FileNode></Items></LogicalFolder><LogicalFolder Name="Miscellaneous" Type="3" Sorted="true"><Items /></LogicalFolder></Items><SccProjectName>$/DataWarehouse/Dev/Reports/PMI</SccProjectName><SccAuxPath /><SccLocalPath>.</SccLocalPath><SccProvider>MSSCCI:Team Foundation Server MSSCCI Provider</SccProvider></SqlWorkbenchSqlProject>
and the XSL file I'm applying is:
<?xml version="1.0" encoding="iso-8859-1"?><xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"><xsl:template match="/"><xsl:copy-of select="."/><xsl:apply-templates/></xsl:template><xsl:template match="/SqlWorkbenchSqlProject/Items/LogicalFolder[Name='Connections']"><xsl:copy-of select="."/></xsl:template><xsl:template match="/SqlWorkbenchSqlProject/Items/LogicalFolder[Name='Queries']"><xsl:copy-of select="."/></xsl:template><xsl:template match="/SqlWorkbenchSqlProject/Items/LogicalFolder[Name='Queries']/Items"><xsl:for-each select="./FileNode"><xsl:sort select="@Name" data-type="text" case-order="upper-first"/><xsl:copy-of select="."/></xsl:for-each></xsl:template><xsl:template match="/SqlWorkbenchSqlProject/Items/LogicalFolder[Name='Miscellaneous']"><xsl:copy-of select="."/></xsl:template></xsl:stylesheet>
I want to sort the FileNode siblings in /SqlWorkbenchSqlProject/Items/LogicalFolder where Name="Queries" by their @Name attribute, but I want the rest of the file to be output as it is.
If I run the transform above, I get additional junk at the end of the file, i.e.:
<?xml version="1.0" encoding="utf-8"?><SqlWorkbenchSqlProject Name="PMISQL" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"><Items><LogicalFolder Name="Connections" Type="2" Sorted="true"><Items><ConnectionNode Name="cerberus:XPOOLE\alistair.moreton"><Created>2013-06-28T15:50:27.919788+01:00</Created><Type>SQL</Type><Server>cerberus</Server><UserName /><Authentication>Windows Authentication</Authentication><InitialDB>master</InitialDB><LoginTimeout>15</LoginTimeout><ExecutionTimeout>0</ExecutionTimeout><ConnectionProtocol>NotSpecified</ConnectionProtocol><ApplicationName>Microsoft SQL Server Management Studio - Query</ApplicationName></ConnectionNode><ConnectionNode Name="hector:XPOOLE\alistair.moreton"><Created>2013-07-02T15:27:02.5793203+01:00</Created><Type>SQL</Type><Server>hector</Server><UserName /><Authentication>Windows Authentication</Authentication><InitialDB /><LoginTimeout>15</LoginTimeout><ExecutionTimeout>0</ExecutionTimeout><ConnectionProtocol>NotSpecified</ConnectionProtocol><ApplicationName>Microsoft SQL Server Management Studio - Query</ApplicationName></ConnectionNode></Items></LogicalFolder><LogicalFolder Name="Queries" Type="0" Sorted="true"><Items><FileNode Name="PMI001_AddressHistory.sql"><AssociatedConnectionMoniker>8c91a03d-f9b4-46c0-a305-b5dcc79ff907:cerberus:True</AssociatedConnectionMoniker><AssociatedConnSrvName>cerberus</AssociatedConnSrvName><AssociatedConnUserName /><FullPath>PMI001_AddressHistory.sql</FullPath></FileNode><FileNode Name="PMI000_DataWarehouseState.sql"><AssociatedConnectionMoniker>8c91a03d-f9b4-46c0-a305-b5dcc79ff907:hector:True</AssociatedConnectionMoniker><AssociatedConnSrvName>hector</AssociatedConnSrvName><AssociatedConnUserName /><FullPath>PMI000_DataWarehouseState.sql</FullPath></FileNode><FileNode Name="PMI003_PlannedAdmissions.sql"><AssociatedConnectionMoniker>8c91a03d-f9b4-46c0-a305-b5dcc79ff907:cerberus:True</AssociatedConnectionMoniker><AssociatedConnSrvName>cerberus</AssociatedConnSrvName><AssociatedConnUserName /><FullPath>PMI003_PlannedAdmissions.sql</FullPath></FileNode><FileNode Name="PMI004_AllActivity.sql"><AssociatedConnectionMoniker>8c91a03d-f9b4-46c0-a305-b5dcc79ff907:cerberus:True</AssociatedConnectionMoniker><AssociatedConnSrvName>cerberus</AssociatedConnSrvName><AssociatedConnUserName /><FullPath>PMI004_AllActivity.sql</FullPath></FileNode><FileNode Name="PMI002_ClinicCodes.sql"><AssociatedConnectionMoniker>8c91a03d-f9b4-46c0-a305-b5dcc79ff907:cerberus:True</AssociatedConnectionMoniker><AssociatedConnSrvName>cerberus</AssociatedConnSrvName><AssociatedConnUserName /><FullPath>PMI002_ClinicCodes.sql</FullPath></FileNode></Items></LogicalFolder><LogicalFolder Name="Miscellaneous" Type="3" Sorted="true"><Items /></LogicalFolder></Items><SccProjectName>$/DataWarehouse/Dev/Reports/PMI</SccProjectName><SccAuxPath /><SccLocalPath>.</SccLocalPath><SccProvider>MSSCCI:Team Foundation Server MSSCCI Provider</SccProvider></SqlWorkbenchSqlProject> 2013-06-28T15:50:27.919788+01:00 SQL cerberus Windows Authentication master 15 0 NotSpecified Microsoft SQL Server Management Studio - Query 2013-07-02T15:27:02.5793203+01:00 SQL hector Windows Authentication 15 0 NotSpecified Microsoft SQL Server Management Studio - Query 8c91a03d-f9b4-46c0-a305-b5dcc79ff907:cerberus:True cerberus PMI001_AddressHistory.sql 8c91a03d-f9b4-46c0-a305-b5dcc79ff907:hector:True hector PMI000_DataWarehouseState.sql 8c91a03d-f9b4-46c0-a305-b5dcc79ff907:cerberus:True cerberus PMI003_PlannedAdmissions.sql 8c91a03d-f9b4-46c0-a305-b5dcc79ff907:cerberus:True cerberus PMI004_AllActivity.sql 8c91a03d-f9b4-46c0-a305-b5dcc79ff907:cerberus:True cerberus PMI002_ClinicCodes.sql $/DataWarehouse/Dev/Reports/PMI . MSSCCI:Team Foundation Server MSSCCI Provider
So:
(a) any idea how I modify the transform to achieve my aim and why, and
(b) where is the junk coming from. I have no XSL nodes that are xsl:value-of, so why are values being output for nodes that have already been processed, and (yes, and),
(c) in general, if I want to generate as output, the input file, except for a subtree that I want to treat differently, how do I go about this?
Any help will be very much appreciated. If I'm in the wrong forum, please point me in the right direction. The Visual Studio forums I've posted in before appear to no longer be.
Many thanks,
Mark