XSLT Cookbook

Errata for XSLT Cookbook

Submit your own errata for this product.

The errata list is a list of errors and their corrections that were found after the product was released.

The following errata were submitted by our customers and have not yet been approved or disproved by the author or editor. They solely represent the opinion of the customer.

Color Key: Serious Technical Mistake Minor Technical Mistake Language or formatting error Typo Question Note Update

Version Location Description Submitted By Date Submitted
Printed Page 2
Section 1.2 "index-of" template

The template "index-of" incorrectly returns one when the parameter $substr is an empty string. It should return zero. The culprit is the test with "contains" which evaluates to true in this case. One possible workarond is to change the line: <xsl:when test="contains($input, $substr)"> to: <xsl:when test="contains($input, $substr) and string-length($substr) > 0">

Printed Page 83
1st line doesn't match the examples zip file version.

The algorithm for calculate-julian-date is not quite right in the examples zip file. The book IS correct - the examples zip file does not take into consideration the leap year days.

Printed Page 195
2nd code block

Line 8 of code uses key('current-grouping-key', ...) which is not defined in the example. It probably ought to be 'products-by-category'. Additionally, the <xsl:template> element is not closed properly.

Printed Page 198
text:wrap code from chapter 5.6

Wrapping loses characters if the "word" is longer than the wrap width. <xsl:call-template name="text:wrap"> <xsl:with-param name="input">1234567890123456789012345678901234567890</xsl:with-param> <xsl:with-param name="width" select="10"/> </xsl:call-template> returns: 1234567890 2345678901 3456789012 4567890 Fix (template text:wrap, page 198, recursive template call): <xsl:with-param name="input" select="substring($input, string-length($line) + 2)"/> ...change to be... <xsl:with-param name="input" select="normalize-space( substring($input, string-length($line) + 1) )"/>

Printed Page 205
last plain text paragraph

december 2005 edition of Sal Mangano XSLT Cookbook 2nd edition Last plain text paragraph on p. 205 I suppose there's a word (eg: don't) missing: The child element xsl:matching-substring is used to process the substring that matches the regex and xsl:non-matching-substring is used to process the substrings that [MISSING?] match the regex.

Printed Page 212
Example just before section 6.4

Your example will NOT strip an arbitrary XML document of all namespaces since it will copy over any namespace nodes that are children of any elements in the document. For example, if you have an xml document similar to: <root> <child xmlns="my.namespace"> <pet>my pet</pet> </child> <root> The namespace will still be present in the copied document. A stylehsheet that DOES strip any and all namespaces, including from the above sample looks as follows: <xsl:template match="*"> <xsl:element name="{local-name()}"> <xsl:apply-templates select="@* | * | text()"/> </xsl:element> </xsl:template> <xsl:template match="@*"> <xsl:attribute name="{local-name()}"> <xsl:value-of select="."/> </xsl:attribute> </xsl:template>

Printed Page 238-39
Eight examples of logic rather than set theory

All of the examples read @smoker='y' when they should read @smoker='yes', the form of the data in people.xml. Thus the first example should read <!-- Male smokers --> <xsl:variable name="super-risk" select="//person[@sex='m' and @smoker='yes']"/>

Printed Page 245
XSLT code

xsl-import statement is missing the initial letter v in the attribute, and should read <xsl:import href="vset.ops.xslt"/>. Also the xsl:with-param statements are correct in the book but incorrect in the downloaded code (unique-people.xslt), where they incorrectly read <xsl:with-param name="node-set1" ... <xsl:with-param name="node-set2" ... instead of <xsl:with-param name="nodes1" ... <xsl:with-param name="nodes2" ...