Subject: [xsl] Semantics of xsl:key (MSXML4 broken?) From: Bill Cohagan <bill.cohagan@xxxxxxxxxxxxx> Date: Fri, 14 Jun 2002 11:04:59 -0500 |
I've got an xsl:key definition that works fine on Saxon 6.5.2, works on Xalan, but does not work on MSXML4SP1. In fact the original XSLT code actually caused MSXML to crash although the "testcase" version just doesn't work properly. The problem I'm trying to solve is to take an XML representation of a relational many-to-many relationship and define a SINGLE xsl:key that will map from one side of the relationship to the other. The testcase uses Authors and Books, so I want to be able to define a key that when given an authorid will produce the set of corresponding Book elements. (Obviously in the real world we'd also like to go the other way, but for testcase purposes I'll just deal with one direction.) Our solution uses an "unusual" use attribute on the xsl:key definition, but if you interpret the spec the way I do then it ought to work just fine. Apparently the Saxon and Xalan authors *do* interpret the spec the way I do on this issue. I've had a brief interchange with a MS person on one of their MSDN "moderated" groups, but he seemed to think that our approach should NOT work, that the use attribute was somehow restricted to *relative* path expression. In any case he vanished before addressing any of my questions to him as to why he and/or MS believed this to be the case. What I'm looking for is some confirmation that the code *ought* to work (as it in fact does in Saxon/Xalan) - or some cogent argument as to why it should not; i.e., an explanation of how the spec disallows this sort of thing. Anyway, here's the testcase code, first the XML, then the XSL, and finally the results, expected and actual. >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>XML>>>>>>>>>>>>>>>>>>>>>> <testcase> <Authors> <Author authorid = "1" name = "author 1"/> <Author authorid = "2" name = "author 2"/> <Author authorid = "3" name = "author 3"/> </Authors> <Books> <Book bookid = "a" name = "book a"/> <Book bookid = "b" name = "book b"/> <Book bookid = "c" name = "book c"/> </Books> <BooksAuthors> <BookAuthor bookauthorid = "x" bookid = "a" authorid = "1"/> <BookAuthor bookauthorid = "y" bookid = "a" authorid = "2"/> <BookAuthor bookauthorid = "z" bookid = "b" authorid = "1"/> <BookAuthor bookauthorid = "w" bookid = "b" authorid = "3"/> </BooksAuthors> </testcase> >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>XSL>>>>>>>>>>>>>>>>>>>>>> <?xml version="1.0"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="xml" omit-xml-declaration="yes" indent = "yes"/> <xsl:key name = 'test' match = 'Book' use = "/testcase/BooksAuthors/BookAuthor[@bookid = current()/@bookid]/@authorid"/> <xsl:template match = "/"> <TESTRESULT> <xsl:for-each select = "key('test','1')"> <xsl:copy-of select = "."/> </xsl:for-each> </TESTRESULT> </xsl:template> </xsl:stylesheet> >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>SAXON RESULT>>>>>>>>>>>>> <TESTRESULT> <Book bookid="a" name="book a"/> <Book bookid="b" name="book b"/> </TESTRESULT> >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>MSXML4 RESULT>>>>>>>>>>>> <TESTRESULT> </TESTRESULT> Thanks in advance, Bill bill@xxxxxxxxxxxxxxxxxxxxx XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list
Current Thread |
---|
|
<- Previous | Index | Next -> |
---|---|---|
RE: [xsl] Beginner picking up xml/x, Scott Purcell | Thread | RE: [xsl] Semantics of xsl:key (MSX, Michael Kay |
Re: [xsl] Unwrapping trees, Jeni Tennison | Date | [xsl] Re: sorting, OBD |
Month |