RE: [xsl] XSLT to query/output a portion of an XML source document

Subject: RE: [xsl] XSLT to query/output a portion of an XML source document
From: cknell@xxxxxxxxxx
Date: Wed, 24 Jan 2007 16:00:35 -0500
I had to clean up your XML ("MasterCatalogResponse" in the opening tag does not match "" in the closing tag), but here is a quick and dirty stylesheet that does what you ask.

Whenever I do one of these, the next person to come along invariably has a much more elegant solution, so you may want to hold your fire pending further responses.

<?xml version="1.0"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform";>
  <xsl:strip-space elements="*" />
  <xsl:output method="xml" indent="yes" encoding="UTF-8" />
  
  <xsl:param name="key1" />
  <xsl:param name="key2" />

    <xsl:template match="/">
        <xsl:apply-templates />
    </xsl:template>
    
	<xsl:template match="Transaction">
	  <xsl:apply-templates />
	</xsl:template>
	
	<xsl:template match="Response">
	  <xsl:apply-templates select="MasterCatalogResponse[ExternalKeys[Key=$key1 and Key=$key2]]" />
	</xsl:template>
	
	<xsl:template match="MasterCatalogResponse">
	  <xsl:copy-of select="EntityData" />
	</xsl:template>

</xsl:stylesheet>
-- 
Charles Knell
cknell@xxxxxxxxxx - email



-----Original Message-----
From:     Chris Coyle <chriscoyle@xxxxxxxxx>
Sent:     Wed, 24 Jan 2007 11:51:12 -0800 (PST)
To:       "Mullberytech.com" <xsl-list@xxxxxxxxxxxxxxxxxxxxxx>
Subject:  [xsl] XSLT to query/output a portion of an XML source document



I need to write a query to pull 1 node out of a source
XML document.

The source document has a structure of 

<Transaction>
	<Response>
		<MasterCatalogResponse>
			<ExternalKeys>
				<Key>1</Key>
				<Key>a</Key>
			</ExternalKeys>
				<EntityData>
					<Attribute>a</Attribute>
					<Attribute>b</Attribute>
				</EntityData>
		</MasterCatalogRecord>
		<MasterCatalogResponse>
			<ExternalKeys>
				<Key>2</Key>
				<Key>b</Key>
			</ExternalKeys>
				<EntityData>
					<Attribute>a</Attribute>
					<Attribute>b</Attribute>
				</EntityData>
		</MasterCatalogRecord>
		<MasterCatalogResponse>
			<ExternalKeys>
				<Key>3</Key>
				<Key>c</Key>
			</ExternalKeys>
				<EntityData>
					<Attribute>a</Attribute>
					<Attribute>b</Attribute>
				</EntityData>
		</MasterCatalogRecord>
	</Response>
</Transaction>

I need to extract the <EntityData> element for a given
<ExternalKeys> value match.  The result should look
like this for an ExternalKeys  (2,b)

				<EntityData>
					<Attribute>a</Attribute>
					<Attribute>b</Attribute>
				</EntityData>


This is what I tried:

<?xml version="1.0" encoding="UTF-8"?>
<?altova_samplexml SampleQueryResponse.xml?>
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform";
xmlns:fo="http://www.w3.org/1999/XSL/Format";
xmlns:xs="http://www.w3.org/2001/XMLSchema";
xmlns:fn="http://www.w3.org/2005/xpath-functions";>

    <xsl:output method="xml" encoding="UTF-8"
indent="yes" />

<xsl:template match="/">
   <xsl:for-each
select="//DataService/Transaction/Response/MasterCatalogRecord">
	   <xsl:element name="EntityData">
		   <xsl:value-of select="."/>
	   </xsl:element>
   </xsl:for-each>
 </xsl:template>

</xsl:stylesheet>


Any suggestions are welcome.

	



 
____________________________________________________________________________________
Bored stiff? Loosen up... 
Download and play hundreds of games for free on Yahoo! Games.
http://games.yahoo.com/games/front

Current Thread