Subject: RE: [xsl] Weird XSLT processor output From: "Michael Kay" <mhk@xxxxxxxxx> Date: Mon, 10 Nov 2003 23:19:52 -0000 |
Saxon also produces the output you consider weird, which is actually the correct output. When you write: <xsl:for-each select="$globalTableNames"> <xsl:element name="TABLE"> <xsl:attribute name="tableid"><xsl:value-of select="."/></xsl:attribute> <xsl:variable name="tablename"><xsl:value-of select="."/></xsl:variable> <xsl:apply-templates select="/DGS/BOOKMARKS/TABLEID[BMTABLE = $tablename]"/> </xsl:element> </xsl:for-each> the absolute path expression /DGS/... selects relative to the root node of the document containing the context node. The context node is an element in $globalTableNames, which came from document('')/..., that is, from the stylesheet. The stylesheet does not have a /DGS element as the outermost element, so this expression selects nothing and the apply-templates produces no output. To select from the root of the principal source document, declare a global variable <xsl:variable name="root" select="/"> and use <xsl:apply-templates select="$root/DGS/BOOKMARKS/TABLEID[BMTABLE = $tablename]"/> Michael Kay > -----Original Message----- > From: owner-xsl-list@xxxxxxxxxxxxxxxxxxxxxx > [mailto:owner-xsl-list@xxxxxxxxxxxxxxxxxxxxxx] On Behalf Of > David Carver > Sent: 10 November 2003 22:27 > To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx > Subject: [xsl] Weird XSLT processor output > > > Okay here is the situation, given the following input XML: <DGS> > <BOOKMARKS> > <TABLEID> > <BMTABLE>CLAIMANT</BMTABLE> > <BMDESC>Address 1</BMDESC> > <BMFIELD>ADDRESS1</BMFIELD> > <XSLTEMP><xsl:template > match="CLAIMANT/ADDRESS1"><xsl:value-of > select="."/></xsl:template></XSLTEMP> > </TABLEID> > <TABLEID> > <BMTABLE>CLAIMANT</BMTABLE> > <BMDESC>Address 2</BMDESC> > <BMFIELD>ADDRESS2</BMFIELD> > <XSLTEMP><xsl:template > match="CLAIMANT/ADDRESS2"><xsl:value-of > select="."/></xsl:template></XSLTEMP> > </TABLEID> > <TABLEID> > <BMTABLE>CLAIMANT</BMTABLE> > <BMDESC>ANUMBER</BMDESC> > <BMFIELD>ANUMBER</BMFIELD> > <XSLTEMP><xsl:template > match="CLAIMANT/ANUMBER"><xsl:value-of > select="."/></xsl:template></XSLTEMP> > </TABLEID> > <TABLEID> > <BMTABLE>CLMREP</BMTABLE> > <BMDESC>State</BMDESC> > <BMFIELD>STATE</BMFIELD> > <XSLTEMP><xsl:template > match="CLMREP/STATE"><xsl:value-of > select="."/></xsl:template></XSLTEMP> > </TABLEID> > <TABLEID> > <BMTABLE>CLMREP</BMTABLE> > <BMDESC>ID</BMDESC> > <BMFIELD>REPID</BMFIELD> > <XSLTEMP><xsl:template > match="CLMREP/REPID"><xsl:value-of > select="."/></xsl:template></XSLTEMP> > </TABLEID> > </BOOKMARKS> > </DGS> > > Desired Output format: > <DGS> > <BOOKMARKS> > <TABLE tableid="tablename"> > <FIELD fieldid="fieldname"> > <DESC>description</DESC> > <XSLTEMP> </XSLTEMP> > </FIELD> > </TABLE> > </BOOKMARKS> > </DGS> > > And the following XSLT's: > > (XSLTA) > > <xsl:stylesheet version="1.0" > xmlns:xsl="http://www.w3.org/1999/XSL/Transform" > xmlns:lookup="urn:some.urn" exclude-result-prefixes="lookup"> > <xsl:output method="xml" version="1.0" encoding="UTF-8" > indent="yes"/> > <lookup:table> > <BMTABLE>CMSCASE</BMTABLE> > <BMTABLE>CLAIMANT</BMTABLE> > <BMTABLE>CLMREP</BMTABLE> > <BMTABLE>CMSGROUP</BMTABLE> > <BMTABLE>EMPLOYER</BMTABLE> > <BMTABLE>EMPREP</BMTABLE> > <BMTABLE>HEARING</BMTABLE> > <BMTABLE>HEAROFFCR</BMTABLE> > <BMTABLE>OTHERCPT</BMTABLE> > <BMTABLE>SUBPOENA</BMTABLE> > </lookup:table> > <xsl:variable name="globalTableNames" > select="document('')/*/lookup:table/*"/> > > <xsl:template match="DGS"> > <xsl:element name="DGS"> > <xsl:apply-templates select="BOOKMARKS" /> > </xsl:element> > </xsl:template> > > <xsl:template match="BOOKMARKS"> > <xsl:element name="BOOKMARKS"> > <xsl:for-each select="$globalTableNames"> > <xsl:element name="TABLE"> > <xsl:attribute > name="tableid"><xsl:value-of select="."/></xsl:attribute> > <xsl:variable > name="tablename"><xsl:value-of select="."/></xsl:variable> > <xsl:apply-templates > select="/DGS/BOOKMARKS/TABLEID[BMTABLE = $tablename]"/> > </xsl:element> > </xsl:for-each> > </xsl:element> > </xsl:template> > > <xsl:template match="TABLEID"> > <test/> > <xsl:element name="FIELD"> > <xsl:attribute name="fieldid"> > <xsl:value-of select="BMFIELD"/> > </xsl:attribute> > <xsl:element name="DESC"> > <xsl:value-of select="BMDESC"/> > </xsl:element> > <xsl:element name="XSLTEMP"> > <xsl:value-of select="XSLTEMP"/> > </xsl:element> > </xsl:element> > </xsl:template> > </xsl:stylesheet> > > (XSLTB) > > <xsl:stylesheet version="1.0" > xmlns:xsl="http://www.w3.org/1999/XSL/Transform" > xmlns:lookup="urn:some.urn" exclude-result-prefixes="lookup"> > <xsl:output method="xml" version="1.0" encoding="UTF-8" > indent="yes"/> > <lookup:table> > <BMTABLE>CMSCASE</BMTABLE> > <BMTABLE>CLAIMANT</BMTABLE> > <BMTABLE>CLMREP</BMTABLE> > <BMTABLE>CMSGROUP</BMTABLE> > <BMTABLE>EMPLOYER</BMTABLE> > <BMTABLE>EMPREP</BMTABLE> > <BMTABLE>HEARING</BMTABLE> > <BMTABLE>HEAROFFCR</BMTABLE> > <BMTABLE>OTHERCPT</BMTABLE> > <BMTABLE>SUBPOENA</BMTABLE> > </lookup:table> > <xsl:variable name="globalTableNames" > select="document('')/*/lookup:table/*"/> > <xsl:template match="DGS"> > <xsl:element name="DGS"> > <xsl:apply-templates select="BOOKMARKS"/> > </xsl:element> > </xsl:template> > <xsl:template match="BOOKMARKS"> > <xsl:element name="BOOKMARKS"> > <xsl:variable name="bookmarks" > select="TABLEID"/> > <xsl:for-each select="$globalTableNames"> > <xsl:element name="TABLE"> > <xsl:attribute > name="tableid"><xsl:value-of select="."/></xsl:attribute> > <xsl:variable name="tablename"> > <xsl:value-of > select="."/> > </xsl:variable> > <xsl:variable > name="tempNodeset" select="$bookmarks[BMTABLE = $tablename]"/> > <xsl:apply-templates > select="$tempNodeset"/> > </xsl:element> > </xsl:for-each> > </xsl:element> > </xsl:template> > > <xsl:template match="TABLEID"> > <xsl:element name="FIELD"> > <xsl:attribute > name="fieldid"><xsl:value-of select="BMFIELD"/></xsl:attribute> > <xsl:element name="DESC"> > <xsl:value-of select="BMDESC"/> > </xsl:element> > <xsl:element name="XSLTEMP"> > <xsl:value-of select="XSLTEMP"/> > </xsl:element> > </xsl:element> > </xsl:template> > </xsl:stylesheet> > > > When run under XML Spy Enterprise 2004, XSLTA and XSLTB both > produce the same desired output. However, when XSLTA is run > under LibXSLT, Sablotron, and MSXML (have not tested xalan or > saxon), the following output is produced: > > <DGS> > <BOOKMARKS> > <TABLE tableid="tablename"/> > <TABLE tableid="tablename"/> > </BOOKMARKS> > </DGS> > > My question is, is XML Spy producing the correct output for > XSLTA or are the other three processors not implementing the > transformation correctly? > > Dave > > > ===== > "...there is nothing stranger than people." - Anonymous > > XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list > XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list
Current Thread |
---|
|
<- Previous | Index | Next -> |
---|---|---|
[xsl] Weird XSLT processor output, David Carver | Thread | RE: [xsl] Weird XSLT processor outp, Passin, Tom |
[xsl] converting XML to XML problem, Abhijit Junnare | Date | RE: [xsl] generating xml from xml, Murali Korrapati |
Month |