[XML-DEV Mailing List Archive Home] [By Thread] [By Date] [Recent Entries] [Reply To This Message] Re: XSTL2.0 stylesheet workarounds for exceptions
Hi Michael,
OK, you are right once again. It was Xalan that was causing a nuisance this time. I have removed Xalan.jar from CLASSPATH and it was smooth sailing with Saxon 9.1 as far as using empty() is concerned. I will use other approaches to associate Saxon 9.1 to this application to gain optimum performance. In the meantime, I now get 2 <hobbie> elements regardless of whether it exist or not. In other word, the default <hobbies>Unknown</hobbies> element is always generated.
The changes made to the original stylesheet are as follows:
<xsl:template match="/"> <employee> <xsl:apply-templates select="//ns:p"/> <xsl:variable name="hobbies" select="ns:p[ns:strong='Hobbies:']"/> <xsl:apply-templates select="$hobbies"/> <xsl:if test="empty($hobbies)"> <hobbies>Unknown</hobbies> </xsl:if> </employee> </xsl:template> <xsl:template match="ns:p[ns:strong='Hobbie:']|ns:p[ns:strong='Hobbies:']"> <xsl:for-each select="ns:a"> <hobbie><xsl:value-of select="."/></hobbie> </xsl:for-each> </xsl:template>
As a result, how to change the stylesheet to create a default (<hobbies>Unknown</hobbies>) element only when "ns:p[ns:strong='Hobbies:']" is invalid? Would a <xsl:choose be suitable in this case but I can't seems to wrap it around the second match template.
Thank you very much once again for your invaluable guidances. Jack From: Michael Kay <mike@s...> To: Jack Bush <netbeansfan@y...> Cc: xml-dev@l... Sent: Friday, 6 February, 2009 8:21:09 PM Subject: RE: XSTL stylesheet workarounds for exceptions Do
System.err.println(hobbiesTransformer.getClass())
to see what XSLT transformation engine you have loaded. All the evidence suggests it's a 1.0 transformer - probably Xalan, possibly Saxon6.
Relying on the classpath to pick up the right XSLT engine is notoriously error-prone. If your code depends on having an XSLT 2.0 processor, the safest thing is to instantiate Saxon directly:
hobbiesTransformer = new net.sf.saxon.TransformerFactoryImpl();
This is incidentally much faster than searching the classpath. (In extreme cases, searching the classpath to find a TransformerFactory can take longer than the entire transformation).
If you don't want a compile-time reference to Saxon in your code, you can either (a) instantiate the factory using reflection, or (b) set the system property
System.setProperty("javax.xml.transform.TransformerFactory", "net.sf.saxon.TransformerFactoryImpl")
Michael Kay
http://www.saxonica.com/
Make Yahoo!7 your homepage and win a trip to the Quiksilver Pro. http://au.rd.yahoo.com/homepage/mailtagline/*http://au.docs.yahoo.com/homepageset/?p1=other&p2=au&p3=tagline.
[Date Prev] | [Thread Prev] | [Thread Next] | [Date Next] -- [Date Index] | [Thread Index] |
PURCHASE STYLUS STUDIO ONLINE TODAY!Purchasing Stylus Studio from our online shop is Easy, Secure and Value Priced! Download The World's Best XML IDE!Accelerate XML development with our award-winning XML IDE - Download a free trial today! Subscribe in XML format
|