This file is indexed.

/usr/share/doc/libsaxon-java/changes.html is in libsaxon-java-doc 1:6.5.5-12.

This file is owned by root:root, with mode 0o644.

The actual contents of the file can be viewed below.

   1
   2
   3
   4
   5
   6
   7
   8
   9
  10
  11
  12
  13
  14
  15
  16
  17
  18
  19
  20
  21
  22
  23
  24
  25
  26
  27
  28
  29
  30
  31
  32
  33
  34
  35
  36
  37
  38
  39
  40
  41
  42
  43
  44
  45
  46
  47
  48
  49
  50
  51
  52
  53
  54
  55
  56
  57
  58
  59
  60
  61
  62
  63
  64
  65
  66
  67
  68
  69
  70
  71
  72
  73
  74
  75
  76
  77
  78
  79
  80
  81
  82
  83
  84
  85
  86
  87
  88
  89
  90
  91
  92
  93
  94
  95
  96
  97
  98
  99
 100
 101
 102
 103
 104
 105
 106
 107
 108
 109
 110
 111
 112
 113
 114
 115
 116
 117
 118
 119
 120
 121
 122
 123
 124
 125
 126
 127
 128
 129
 130
 131
 132
 133
 134
 135
 136
 137
 138
 139
 140
 141
 142
 143
 144
 145
 146
 147
 148
 149
 150
 151
 152
 153
 154
 155
 156
 157
 158
 159
 160
 161
 162
 163
 164
 165
 166
 167
 168
 169
 170
 171
 172
 173
 174
 175
 176
 177
 178
 179
 180
 181
 182
 183
 184
 185
 186
 187
 188
 189
 190
 191
 192
 193
 194
 195
 196
 197
 198
 199
 200
 201
 202
 203
 204
 205
 206
 207
 208
 209
 210
 211
 212
 213
 214
 215
 216
 217
 218
 219
 220
 221
 222
 223
 224
 225
 226
 227
 228
 229
 230
 231
 232
 233
 234
 235
 236
 237
 238
 239
 240
 241
 242
 243
 244
 245
 246
 247
 248
 249
 250
 251
 252
 253
 254
 255
 256
 257
 258
 259
 260
 261
 262
 263
 264
 265
 266
 267
 268
 269
 270
 271
 272
 273
 274
 275
 276
 277
 278
 279
 280
 281
 282
 283
 284
 285
 286
 287
 288
 289
 290
 291
 292
 293
 294
 295
 296
 297
 298
 299
 300
 301
 302
 303
 304
 305
 306
 307
 308
 309
 310
 311
 312
 313
 314
 315
 316
 317
 318
 319
 320
 321
 322
 323
 324
 325
 326
 327
 328
 329
 330
 331
 332
 333
 334
 335
 336
 337
 338
 339
 340
 341
 342
 343
 344
 345
 346
 347
 348
 349
 350
 351
 352
 353
 354
 355
 356
 357
 358
 359
 360
 361
 362
 363
 364
 365
 366
 367
 368
 369
 370
 371
 372
 373
 374
 375
 376
 377
 378
 379
 380
 381
 382
 383
 384
 385
 386
 387
 388
 389
 390
 391
 392
 393
 394
 395
 396
 397
 398
 399
 400
 401
 402
 403
 404
 405
 406
 407
 408
 409
 410
 411
 412
 413
 414
 415
 416
 417
 418
 419
 420
 421
 422
 423
 424
 425
 426
 427
 428
 429
 430
 431
 432
 433
 434
 435
 436
 437
 438
 439
 440
 441
 442
 443
 444
 445
 446
 447
 448
 449
 450
 451
 452
 453
 454
 455
 456
 457
 458
 459
 460
 461
 462
 463
 464
 465
 466
 467
 468
 469
 470
 471
 472
 473
 474
 475
 476
 477
 478
 479
 480
 481
 482
 483
 484
 485
 486
 487
 488
 489
 490
 491
 492
 493
 494
 495
 496
 497
 498
 499
 500
 501
 502
 503
 504
 505
 506
 507
 508
 509
 510
 511
 512
 513
 514
 515
 516
 517
 518
 519
 520
 521
 522
 523
 524
 525
 526
 527
 528
 529
 530
 531
 532
 533
 534
 535
 536
 537
 538
 539
 540
 541
 542
 543
 544
 545
 546
 547
 548
 549
 550
 551
 552
 553
 554
 555
 556
 557
 558
 559
 560
 561
 562
 563
 564
 565
 566
 567
 568
 569
 570
 571
 572
 573
 574
 575
 576
 577
 578
 579
 580
 581
 582
 583
 584
 585
 586
 587
 588
 589
 590
 591
 592
 593
 594
 595
 596
 597
 598
 599
 600
 601
 602
 603
 604
 605
 606
 607
 608
 609
 610
 611
 612
 613
 614
 615
 616
 617
 618
 619
 620
 621
 622
 623
 624
 625
 626
 627
 628
 629
 630
 631
 632
 633
 634
 635
 636
 637
 638
 639
 640
 641
 642
 643
 644
 645
 646
 647
 648
 649
 650
 651
 652
 653
 654
 655
 656
 657
 658
 659
 660
 661
 662
 663
 664
 665
 666
 667
 668
 669
 670
 671
 672
 673
 674
 675
 676
 677
 678
 679
 680
 681
 682
 683
 684
 685
 686
 687
 688
 689
 690
 691
 692
 693
 694
 695
 696
 697
 698
 699
 700
 701
 702
 703
 704
 705
 706
 707
 708
 709
 710
 711
 712
 713
 714
 715
 716
 717
 718
 719
 720
 721
 722
 723
 724
 725
 726
 727
 728
 729
 730
 731
 732
 733
 734
 735
 736
 737
 738
 739
 740
 741
 742
 743
 744
 745
 746
 747
 748
 749
 750
 751
 752
 753
 754
 755
 756
 757
 758
 759
 760
 761
 762
 763
 764
 765
 766
 767
 768
 769
 770
 771
 772
 773
 774
 775
 776
 777
 778
 779
 780
 781
 782
 783
 784
 785
 786
 787
 788
 789
 790
 791
 792
 793
 794
 795
 796
 797
 798
 799
 800
 801
 802
 803
 804
 805
 806
 807
 808
 809
 810
 811
 812
 813
 814
 815
 816
 817
 818
 819
 820
 821
 822
 823
 824
 825
 826
 827
 828
 829
 830
 831
 832
 833
 834
 835
 836
 837
 838
 839
 840
 841
 842
 843
 844
 845
 846
 847
 848
 849
 850
 851
 852
 853
 854
 855
 856
 857
 858
 859
 860
 861
 862
 863
 864
 865
 866
 867
 868
 869
 870
 871
 872
 873
 874
 875
 876
 877
 878
 879
 880
 881
 882
 883
 884
 885
 886
 887
 888
 889
 890
 891
 892
 893
 894
 895
 896
 897
 898
 899
 900
 901
 902
 903
 904
 905
 906
 907
 908
 909
 910
 911
 912
 913
 914
 915
 916
 917
 918
 919
 920
 921
 922
 923
 924
 925
 926
 927
 928
 929
 930
 931
 932
 933
 934
 935
 936
 937
 938
 939
 940
 941
 942
 943
 944
 945
 946
 947
 948
 949
 950
 951
 952
 953
 954
 955
 956
 957
 958
 959
 960
 961
 962
 963
 964
 965
 966
 967
 968
 969
 970
 971
 972
 973
 974
 975
 976
 977
 978
 979
 980
 981
 982
 983
 984
 985
 986
 987
 988
 989
 990
 991
 992
 993
 994
 995
 996
 997
 998
 999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581
1582
1583
1584
1585
1586
1587
1588
1589
1590
1591
1592
1593
1594
1595
1596
1597
1598
1599
1600
1601
1602
1603
1604
1605
1606
1607
1608
1609
1610
1611
1612
1613
1614
1615
1616
1617
1618
1619
1620
1621
1622
1623
1624
1625
1626
1627
1628
1629
1630
1631
1632
1633
1634
1635
1636
1637
1638
1639
1640
1641
1642
1643
1644
1645
1646
1647
1648
1649
1650
1651
1652
1653
1654
1655
1656
1657
1658
1659
1660
1661
1662
1663
1664
1665
1666
1667
1668
1669
1670
1671
1672
1673
1674
1675
1676
1677
1678
1679
1680
1681
1682
1683
1684
1685
1686
1687
1688
1689
1690
1691
1692
1693
1694
1695
1696
1697
1698
1699
1700
1701
1702
1703
1704
1705
1706
1707
1708
1709
1710
1711
1712
1713
1714
1715
1716
1717
1718
1719
1720
1721
1722
1723
1724
1725
1726
1727
1728
1729
1730
1731
1732
1733
1734
1735
1736
1737
1738
1739
1740
1741
1742
1743
1744
1745
1746
1747
1748
1749
1750
1751
1752
1753
1754
1755
1756
1757
1758
1759
1760
1761
1762
1763
1764
1765
1766
1767
1768
1769
1770
1771
1772
1773
1774
1775
1776
1777
1778
1779
1780
1781
1782
1783
1784
1785
1786
1787
1788
1789
1790
1791
1792
1793
1794
1795
1796
1797
1798
1799
1800
1801
1802
1803
1804
1805
1806
1807
1808
1809
1810
1811
1812
1813
1814
1815
1816
1817
1818
1819
1820
1821
1822
1823
1824
1825
1826
1827
1828
1829
1830
1831
1832
1833
1834
1835
1836
1837
1838
1839
1840
1841
1842
1843
1844
1845
1846
1847
1848
1849
1850
1851
1852
1853
1854
1855
1856
1857
1858
1859
1860
1861
1862
1863
1864
1865
1866
1867
1868
1869
1870
1871
1872
1873
1874
1875
1876
1877
1878
1879
1880
1881
1882
1883
1884
1885
1886
1887
1888
1889
1890
1891
1892
1893
1894
1895
1896
1897
1898
1899
1900
1901
1902
1903
1904
1905
1906
1907
1908
1909
1910
1911
1912
1913
1914
1915
1916
1917
1918
1919
1920
1921
1922
1923
1924
1925
1926
1927
1928
1929
1930
1931
1932
1933
1934
1935
1936
1937
1938
1939
1940
1941
1942
1943
1944
1945
1946
1947
1948
1949
1950
1951
1952
1953
1954
1955
1956
1957
1958
1959
1960
1961
1962
1963
1964
1965
1966
1967
1968
1969
1970
1971
1972
1973
1974
1975
1976
1977
1978
1979
1980
1981
1982
1983
1984
1985
1986
1987
1988
1989
1990
1991
1992
1993
1994
1995
1996
1997
1998
1999
2000
2001
2002
2003
2004
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
2025
2026
2027
2028
2029
2030
2031
2032
2033
2034
2035
2036
2037
2038
2039
2040
2041
2042
2043
2044
2045
2046
2047
2048
2049
2050
2051
2052
2053
2054
2055
2056
2057
2058
2059
2060
2061
2062
2063
2064
2065
2066
2067
2068
2069
2070
2071
2072
2073
2074
2075
2076
2077
2078
2079
2080
2081
2082
2083
2084
2085
2086
2087
2088
2089
2090
2091
2092
2093
2094
2095
2096
2097
2098
2099
2100
2101
2102
2103
2104
2105
2106
2107
2108
2109
2110
2111
2112
2113
2114
2115
2116
2117
2118
2119
2120
2121
2122
2123
2124
2125
2126
2127
2128
2129
2130
2131
2132
2133
2134
2135
2136
2137
2138
2139
2140
2141
2142
2143
2144
2145
2146
2147
2148
2149
2150
2151
2152
2153
2154
2155
2156
2157
2158
2159
2160
2161
2162
2163
2164
2165
2166
2167
2168
2169
2170
2171
2172
2173
2174
2175
2176
2177
2178
2179
2180
2181
2182
2183
2184
2185
2186
2187
2188
2189
2190
2191
2192
2193
2194
2195
2196
2197
2198
2199
2200
2201
2202
2203
2204
2205
2206
2207
2208
2209
2210
2211
2212
2213
2214
2215
2216
2217
2218
2219
2220
2221
2222
2223
2224
2225
2226
2227
2228
2229
2230
2231
2232
2233
2234
2235
2236
2237
2238
2239
2240
2241
2242
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">

<HTML><HEAD><TITLE label="&nbsp;Changes&nbsp;">SAXON: Change History</TITLE>

<META content="text/html; charset=windows-1252" http-equiv=Content-Type>
</HEAD>
<BODY bgColor=#ddeeff leftMargin=150><FONT face="Arial, Helvetica, sans-serif">
<div align=right><a href="index.html">SAXON home page</a></div>
<H1><BIG><FONT color=#ff0080>SAXON: Change History</FONT></BIG></H1>

<p>This file describes changes for versions 6.0 through to 6.5.5. Earlier history is logged
here:</p>

<ul>
<li><a href="http://saxon.sourceforge.net/saxon6.5.3/changes5.html">Changes from version 5.0 to version 5.5.2</a></li>
<li><a href="http://saxon.sourceforge.net/saxon6.5.3/history.html">Changes from version 2.0 to version 5.0</a></li>
</ul>

<p>At the time of writing the most recent release of Saxon is version 8.4. For information about current Saxon
versions, see <a href="http://saxon.sf.net/">http://saxon.sf.net/</a>.</p>

<H2>Changes in version 6.5.5 (2005-11-24)</H2>

<p>Version 6.5.5 fixes several bugs:</p>

<ol>
<li><p>Under JDK 1.5, if the output filename contains spaces (or other special characters) these are translated
by Saxon 6.5.4 (and earlier releases) to %HH escape sequences. For example specifying <code>-o "my file.out"</code>
on the command line results in the output being written to <code>my%20file.out</code>. The problem arises because
the JDK 1.5 implementation of the JAXP <code>StreamResult</code> class escapes special characters in file names,
whereas previous releases did not. The new behavior is correct, but Saxon contained a workaround for the previous
incorrect behavior which is no longer appropriate.</p></li>

<li><p>Saxon 6.5.4 and earlier did not allow attribute and namespace nodes to be numbered using <code>&lt;xsl:number level="single"&gt;</code>.
This should be permitted according to the specification, and 
if the <code>count</code> and <code>from</code> patterns are omitted the result should always be 1 (one).</p></li>

<li><p>Saxon 6.5.5 now performs an accurate validation of QNames used in XPath expressions and in various XSLT
contexts, for example template names and variable names. Previously the check was an approximation, because 
some characters were classified differently in Java and in XML.</p></li>

<li><p>When running from the command line, if a user-supplied URIResolver is used, and returns <code>null</code>
when resolving the source file or stylesheet named in the command line arguments, then the standard URI resolver
is now invoked to resolve the names.</p></li>

<li><p>Whitespace-stripping is now performed (as specified by <code>xsl:strip-space</code>) when the transformation
is invoked as a JAXP <code>TransformerHandler</code>.</p></li>

</ol>

<p>This version also adds the <code>saxon:require-well-formed</code> output property from Saxon 8.x. Normally,
if transformation output is sent to a SAX <code>ContentHandler</code> (for example, because the JAXP result
is a <code>SAXResult</code>), then it must represent a well-formed
document (that is, there must be a single element node and no text nodes as children of the root). By setting
this <code>&lt;xsl:output saxon:require-well-formed="no"&gt;</code>, you can indicate that your 
<code>ContentHandler</code> is prepared to accept output that is not well-formed.</p>


<H2>Changes in version 6.5.4 (2005-06-22)</H2>

<p>The <code>TransformerFactoryImpl</code> (Saxon's implementation of the JAXP 
<code>TransformerFactory</code> class) now supports the method <code>setFeature</code>
introduced in JAXP 1.3. However, the "secure processing" feature which the specification
says all implementations must provide is not supported.</p>

<p>The <code>Controller</code> (Saxon's implementation of the JAXP <code>Transformer</code>
class) now implements the <code>reset()</code> method introduced in JAXP 1.3. Note that the
<code>reset()</code> method does not clear the document pool (the collection of documents loaded
using the <code>document()</code> function. This is because the purpose of resetting a Transformer
rather than creating a new one is in order to reuse resources.</p>

<p>The Saxon tree models implement DOM interfaces. This support has been upgraded so that
all DOM level 3 methods are present, as required in order to compile the code under JDK 1.5.
In many cases, the new methods are trivial implementations, that is, they typically return null
or throw an <code>UnsupportedOperationException</code> if called.</p>

<p>In the <code>NodeInfo</code> interface, the method <code>isSameNode()</code> has been
renamed <code>isSameNodeInfo()</code> to avoid conflict with the DOM Level 3 interface of the
same name.</p>

<p>To allow compilation under JDK 1.5, variables named "enum" have been renamed.</p>

<p>The algorithm for generating IDs for attribute and namespace nodes has been changed
in both the tiny tree and the standard tree. The
previous algorithm did not guarantee that the IDs consisted of ASCII alphanumeric characters, as
required by the XSLT 1.0 specification.</p>

<p>In version 6.5.3 the following bug was present, and has now been fixed:
<i>When comparing two nodes for identity (e.g. when evaluating the union operator |), 
an element, text, comment or PI node may be considered identical to an attribute or namespace 
node if they happen to be at the same offset in their respective data structures. 
This problem applied to the TinyTree only.</i></p>

<p>A performance bug in the implementation of result tree fragments has been fixed. The code
in <code>FragmentValue.java</code> used the construct <code>new Vector(20, 20)</code> to allocate
space for nodes on the tree; the effect of this is that a fixed allocation unit of 20 items is used, meaning
that the cost of constructing the tree increases as the square of the number of nodes.</p>

<p>Several bugs in <code>xsl:number</code> have been fixed:</p>

<ul>
<li><p>The implementation now correctly handles a format
pattern that contains no formatting tokens, for example <code>format="*"</code> (the resulting output
takes the form <code>*12*</code>). {test numb26}</p></li>

<li><p>The first non-alphanumeric token in the format picture is no longer treated as a separator
token, so if multiple numbers are output using a format picture of <code>(1)</code>, the output is now
<code>(1.2.3)</code> rather than <code>(1(2(3)</code>. {test numb35}</p></lli>

<li><p>Saxon now returns  the correct results for <code>&lt;xsl:number level="any"&gt;</code> 
when the context node is an attribute that does not match the count pattern, and 
when its parent is an element that does match the count pattern. {test numb32}</p></li>
</ul>

<p>An error is now reported if there are two templates in different stylesheet modules with the
same name and the same import precedence, provided (a) that there is no template with that name
and higher import precedence, and (b) that the template is actually referenced in an <code>xsl:call-template</code>
instruction. {test error052}</p>

<p>An error is now reported if a namespace prefix used in the <code>exclude-result-prefixes</code> attribute
of the <code>xsl:stylesheet</code> element of an imported or included stylesheet module has not been declared,
unless the module is in forwards-compatible mode (for example, because it specifies <code>version="2.0"</code>.
{test error235}</p>

<p>Within <code>xsl:for-each</code>, any <code>xsl:sort</code> elements must now precede any other instructions.
{test error172}</p>

<p>Some previously unreported errors have been found as a result of running Saxon 6.5.4 against the test suite
for Saxon 8.5. The following bugs have been fixed:</p>

<ul>
<li><p>Saxon 6.5.3 did not fail cleanly when there are too many nested <code>xsl:apply-templates</code> calls.
{test error051}</p></li>

<li><p>Saxon 6.5.3 threw a NullPointerException if an <code>xsl:stylesheet</code> or <code>xsl:transform</code>
element appeared as a child of another element in the stylesheet. {test error236}</p></li>

<li><p>Saxon 6.5.3 failed when processing a literal result element appearing within an <code>xsl:fallback</code> instruction.
{test ver23}</p></li>

<li><p>Saxon 6.5.3 produced an ArrayIndexOutOfBoundsException when serializing an element that (a)
is included in the <code>cdata-section-elements</code> attribute of <code>xsl:output</code>, and (b)
contains a Unicode character above 65535 (a "supplementary character"). {test output176}</p></li>

<li><p>Saxon 6.5.3 threw an ArrayIndexOutOfBounds exception when calling an extension function if the
target class contained both a matching static method with N arguments and a matching non-static method
with N-1 arguments.</p></li>

<li><p>Saxon 6.5.3, when operating in forwards compatibility mode, does not ignore all 1.0 errors (for example,
XSLT 2.0 features) appearing within the children of an unrecognized top-level element such as the XSLT 2.0
<code>xsl:function</code> element.</li></p>

<li><p>Saxon 6.5.3, when operating in forwards compatibility mode, does not always treat an optional
attribute with an unrecognized value as if the attribute were not specified. This is a difficult problem to fix
across the board, but it has been fixed for some particular cases that arise when Saxon 6.5.4 is presented
with an XSLT 2.0 stylesheet, for example if the <code>mode</code> attribute of <code>xsl:template</code>
or <code>xsl:apply-templates</code> is not a valid QName then the attribute is ignored {test cnfr18}. A match pattern
that XSLT 1.0 does not allow is now treated (when in forwards compatibility mode) as a pattern that no
nodes will match {test ver24} (this is not an explicit rule in the XSLT 1.0 specification, but seems to be the best thing
to do given the intent behind forwards compatibility mode.)</li></p>

<li><p>In Saxon 6.5.3, the JDOM adapter (when used with the JDOM 1.0 release) did not correctly handle 
the namespace axis, nor the DocType node in a JDOM tree. It also did not allow access to attributes
in the XML namespace (such as xml:space)</p></li>

</ul>

<p>Support for FOP has been dropped.</p>

<p>Saxon 6.5.4 is no longer supported under JDK 1.1. In consequence, Instant Saxon, which relied on the Microsoft
JVM, is no longer available.</p>

<p>The applet support module XSLTProcessorApplet, and the sample HTML pages illustrating use of Saxon as an applet,
have been dropped.</p>


<H2>Changes in version 6.5.3 (2003-08-10)</H2>

<p>Added the EXSLT functions in package math: abs, acos, asin, atan, atan2,
constant, cos, exp, log, power, random, sin, sqrt, tan. Thanks to Simon St. Laurent
for these.</p>

<H2>Changes in version 6.5.2 (2002-04-11) </H2>

<p>The mechanism for keeping stylesheet signatures in the namepool has been removed. It caused
a creeping "memory leak" in continuously running services, and is not really needed. It was invented
to allow namepools to be copied, but this facility has never been properly documented or tested.
Instead, there is now a simple check that the source document and stylesheet are using the same
namepool.</p> 

<H2>Changes in version 6.5.1 (2002-02-08) </H2>

<p>Added extension functions saxon:pause-tracing() and saxon:resume-tracing()</p>

<p>Suppress lazy evaluation of assignable variables. (This was designed to prevent
a stack overflow, it didn't succeed, but it seems a good idea anyway).</p>

<H2>Changes in version 6.5 (2001-11-15) </H2>

<p>This is primarily a maintenance release for error clearance, however, it introduces
an important incompatible change for XSLT conformance reasons.</p>

<h3>XSLT 1.0 conformance</h3>

<p><b>To use XSLT version 1.1 features, the stylesheet should now specify version="1.1".</b>
The W3C XSL Working Group has announced that XSLT 1.1 will not
be progressed beyond the working draft stage. Therefore, in the interests of
standards conformance and stylesheet portability, Saxon 6.5 allows version 1.1
features to be used only if the stylesheet specifically indicates that it intends
to use them. Specifically, this affects three features:</p>

<ul>
<li>The <code>xsl:document</code> element (but not <code>saxon:output</code>, which is a synonym)</li>
<li>The <code>xsl:script</code> element (but not <code>saxon:script</code>, which is a synonym)</li>
<li>The ability to use a result tree fragment (also known as a temporary tree) in a context
where a node-set is required, typically a path expression or filter expression.</li>
</ul>

<p>To use these features, the stylesheet must invoke <i>forwards-compatible mode</i>.
This is done by specifying any value other than "1.0" as the value of the <code>version</code>
attribute of the <code>xsl:stylesheet</code> element, or as the value of the <code>xsl:version</code>
attribute on a containing literal result element. For clarity, I recommend setting
<code>version="1.1"</code>.</p>

<p>Note that for the third feature, the ability to use a result tree fragment as a node-set,
it is the <code>xsl:variable</code> element that creates the result tree fragment that
must be executed in forwards-compatible mode, not the expression where it is used.</p>

<p>When the stylesheet specifies <code>version="1.0"</code>, the saxon:node-set() or
exslt:node-set() function can be used to convert a result tree fragment to a node-set.</p>

<h3>Security advice: disabling extension functions</h3>

<p>A new switch has been added to disable use of extension functions, other than
the system-supplied Saxon and EXSLT extension functions. The switch can be set from
the command line (<code>-noext</code> option) or by calling:</p>
 
<p><code>setAttribute(FeatureKeys.ALLOW_EXTERNAL_FUNCTIONS, new Boolean(false))</code></p>

<p>on the TransformerFactory object. This switch is useful when running Saxon as part
of a servlet environment, if the stylesheets to be executed are untrusted. It prevents
the security risk of an untrusted stylesheet invoking arbitrary Java methods on the
 server machine that use, modify, or delete privileged system resources.</p>
 
<H3>JAXP 1.1 Support</H3>

<p>The reference implementation of JAXP 1.1 available from Sun has not changed for some
time, and has one or two annoying bugs. A much more recent version, in which these bugs
are cleared, is available from Apache as part of the Xalan product. I have therefore
updated the JAXP library in Saxon using the implementation included with Xalan-j_2_2_D11.
An additional benefit is that the Apache distribution includes source code, which is
not available from Sun. I have made no changes to this source code (not even to change 
the default parser and XSLT processor).</p>

<H3>Miscellaneous</H3>

<ul>
<li>Added support for utf-16 output encoding</li>
<li>Added support for CP852 output encoding, used in Czech and Slovak. Thanks to
Zdenek Wagner [wagner@cesnet.cz] for supplying these. Other extensions for these
languages (for example, collating sequences) can be found at 
<a href="http://icebearsoft.euweb.cz/xml/index-en.html">icebearsoft</a>.</li>
<li>The <code>saxon.jar</code> file is now built with a manifest that identifies
its main class, so you can invoke Saxon with the command line:<br />
<code><b>java -jar saxon.jar source.xml style.xsl</b></code>
</ul> 

<H3>Defects cleared</H3>

<ul>
<li><a href="http://sourceforge.net/tracker/index.php?func=detail&aid=474923&group_id=29872&atid=397617">474923</a>:
Failure to reset parameters when using a Transformer for more than one transformation.</li>

<li><a href="http://sourceforge.net/tracker/index.php?func=detail&aid=472844&group_id=29872&atid=397617">472844</a>:
AElfred fails to handle byte-order-mark at start of UTF-8 files.
Also fixed some problems with AElfred diagnostics: reporting
of byte position for a bad UTF-8 byte, and reporting of failures to resolve a URL for
a DTD or other external entity.</li>

<li><a href="http://sourceforge.net/tracker/index.php?func=detail&aid=441078&group_id=29872&atid=397617">441078</a>:
The original fix for this in Saxon 6.4.3 had the unfortunate side-effect that result tree fragments
were referenced in the document pool for the duration of a transformation, meaning that
they could never be cleared from memory by the garbage collector. This is now
fixed, by rewriting the DocumentPool class. Note that it remains true that the DocumentPool
is not reset automatically after doing a transform() - this caching can be useful when
several transformations use the same lookup documents. To clear the pool, either create
a new Transformer for each transformation, or call the new clearDocumentPool() method.</li>

<li><a href="http://sourceforge.net/tracker/index.php?func=detail&aid=481258&group_id=29872&atid=397617">481258</a>:
id() function in complex predicates (an expression reduction bug)</li>

<li><a href="http://sourceforge.net/tracker/index.php?func=detail&aid=463578&group_id=29872&atid=397617">463578</a>:
sum() function in complex predicates (another expression reduction bug)</li>

<li><a href="http://sourceforge.net/tracker/index.php?func=detail&aid=481381&group_id=29872&atid=397617">481381</a>:
When a Writer is supplied to accept Saxon output, with encoding "UTF-8", Saxon writes an
XML declaration saying encoding="UTF8".</li>

<li><a href="http://sourceforge.net/tracker/index.php?func=detail&aid=472842&group_id=29872&atid=397617">472842</a>:
AElfred reports that PE reference isn't allowed in the internal DTD subset, in certain situations
where it should be allowed.</li>

<li><a href="http://sourceforge.net/tracker/index.php?func=detail&aid=445881&group_id=29872&atid=397617">445881</a>:
AElfred incorrectly resolves a relative URI for an external entity. It resolves it relative
to the resource containing the entity reference, not the resource containing the entity
declaration.</li>

</ul>


<H2>Changes in version 6.4.4 (2001-09-18) </H2>

<p>This is primarily a maintenance release for error clearance.</p>

<p>Defects fixed (details at <a href="http://saxon.sourceforge.net/">SourceForge</a>):</p>

<ul>
<li><a href="http://sourceforge.net/tracker/index.php?func=detail&aid=443487&group_id=29872&atid=397617">443487</a>
- No document number generated for a document supplied using a TransformerHandler</li>
<li><a href="http://sourceforge.net/tracker/index.php?func=detail&aid=444070&group_id=29872&atid=397617">444070</a> 
- Command line -a option fails if PI contains "title"</li>
<li><a href="http://sourceforge.net/tracker/index.php?func=detail&aid=444173&group_id=29872&atid=397617">444173</a>
- NullPointer exception when stylesheet supplied as DOMSource with no SystemID</li>
<li><a href="http://sourceforge.net/tracker/index.php?func=detail&aid=444075&group_id=29872&atid=397617">444075</a>
- Multiple namespace nodes when processing a DOMSource</li>
<li><a href="http://sourceforge.net/tracker/index.php?func=detail&aid=444530&group_id=29872&atid=397617">444530</a>
- ArrayIndexOutOfBoundsException while evaluating distinct() function</li>
<li><a href="http://sourceforge.net/tracker/index.php?func=detail&aid=445161&group_id=29872&atid=397617">445161</a>
- Overriding a global parameter using xsl:import</li> 
<li><a href="http://sourceforge.net/tracker/index.php?func=detail&aid=448377&group_id=29872&atid=397617">448377</a>
- dayInWeek() gives wrong answer</li>
<li><a href="http://sourceforge.net/tracker/index.php?func=detail&aid=448711&group_id=29872&atid=397617">448711</a>
- NullPointerException with misspelled attribute name in xsl:strip-space</li>
<li><a href="http://sourceforge.net/tracker/index.php?func=detail&aid=449219&group_id=29872&atid=397617">449219</a>
- week-in-year() misnamed as week-number()</li>
<li><a href="http://sourceforge.net/tracker/index.php?func=detail&aid=457166&group_id=29872&atid=397617">457166</a>
- AbstractNode doesn't implement DOMLocator</li>
<li><a href="http://sourceforge.net/tracker/index.php?func=detail&aid=457176&group_id=29872&atid=397617">457176</a>
- Identity Transformer loses comments</li>
<li><a href="http://sourceforge.net/tracker/index.php?func=detail&aid=459543&group_id=29872&atid=397617">459543</a>
- Intensional node-set dependency problem involving an AxisExpression</li>
<li><a href="http://sourceforge.net/tracker/index.php?func=detail&aid=462241&group_id=29872&atid=397617">462241</a>
- Identity transformer loses element names when using Crimson XML parser</li>

</ul>

<p>Preview mode (the &lt;saxon:preview&gt; extension) was never designed to work when using
a TransformerHandler in the JAXP interface, only when using the transform() method.
This is now documented as a restriction.</p>

<p>FOP integration has been upgraded to work with FOP 0.20.1. It no longer works with
previous FOP releases. However, if you need to use Saxon 6.4.4 with FOP 0.19.0, you
should be able to do so by using the saxon-fop.jar issued with 6.4.3, along
with the 6.4.4 version of saxon.jar.</p>

<p>JDOM integration has been upgraded to work with JDOM 0.7. It no longer works with
previous JDOM releases. However, if you need to use Saxon 6.4.4 with JDOM 0.6, you
should be able to do so by using the saxon-jdom.jar issued with 6.4.3, along with the
6.4.4 version of saxon.jar. Saxon's JDOM integration now relies on the JDOM tree being
built with entities expanded (which is the default). Saxon does not yet support the new
JDOMSource and JDOMResult classes included in JDOM 0.7.</p>

<p>Writing an attribute node when there is no open element start tag is now a
recoverable error: the action depends on the recovery policy (by default, a warning
is output and processing continues).</p>

<p>Writing a text node with disable-output-escaping when it includes a character
outside the character set supported by the output encoding was previously treated
as an unrecoverable error; this has changed so the processor recovers silently
(by not disabling output escaping).</p>

<p>This means that all errors for which the XSLT specification describes a recovery
action are now either (a) handled according to the recovery policy selected by the
user, or (b) recovered silently, using the recovery action described in the XSLT
Recommendation. None of these errors are signalled unconditionally.</p>

<p>The <b>DTDGenerator</b>, previously issued as a sample Saxon application, has
been rewritten as a pure SAX application. Since it no longer makes use of Saxon,
but works with any JAXP 1.1 compliant XML parser,
it is now issued as a free-standing package under the
 <a href="http://saxon.sourceforge.net/">Saxon project at SourceForge</a>,
 with its own version number (initially 7.0).</p>
 
<p>The handling of <b>xsl:message terminate="yes"</b> has changed. Previously the
transform() method output a message to System.err, and then returned normally. Now
the transform() method outputs no message (other than the message output by xsl:message
itself) but throws a <code>com.icl.saxon.style.TerminationException</code>, 
which is a subclass of <code>jaxp.xml.transform.TransformerException</code>.
The command-line driver com.icl.saxon.Stylesheet now handles this exception, so the
only change in the behavior of the command line is that a result code
(1) is now returned. When using the Java API, the application can now detect the condition
by catching the TerminationException.</p>

<p>There are a couple of new optimisations, prompted by an example submitted by Evan Lenz:</p>

<ul>
<li>The document() function, if it has constant arguments, is now evaluated when the 
expression is reduced - this typically means that it is evaluated only once if it is used
in a predicate or a sort key. I still avoid evaluating the document function at compile
time, in the way that all other constant expressions are pre-evaluated, on the grounds that
the contents of the referenced document may change.</li>
<li>Any path expression whose first component is a constant node-set (typically, a path
expression starting with document() or current() or with a variable reference) is now
converted to a "node-set intent" when it is reduced. This means that if such an expression
is used in a predicate, the node-set will be evaluated the first three times it is used,
but if it is used more than thrice, memory will be allocated for it so that it doesn't need
to be evaluated again. This behaves the same way as if the node-set is assigned to a
variable and the variable is used within the predicate.</li>
<li>Certain path expressions and filter expressions are now statically recognized as 
always returning nodes from the same document as the context node. These include most
path and filter expressions, with exceptions such as those beginning with document() or with a variable
reference. Within such an expression, any absolute path expression (beginning with "/", id(),
or key()) within a predicate is now evaluated once only, since it will have the same value
for all the nodes being filtered.</li>
</ul>

<p>A new extension function has been added for parsing the content of processing
instructions: <a href="extensions.html#getpseudoattribute">getPseudoAttribute()</a>.</p>

<H2>Changes in version 6.4.3 (2001-07-13)</H2>

<p>This is a maintenance release for error clearance.</p>

<h3>Defects cleared</h3>

<p>The following defects are cleared in this release. Full details of all Saxon bugs
are now placed on the SourceForge register as soon as the problem is acknowledged to be
a bug.</p>

<ul>
<li><a href="http://sourceforge.net/tracker/index.php?func=detail&aid=440384&group_id=29872&atid=397617">440384</a>
Overriding an imported variable causes an exception</li>
<li><a href="http://sourceforge.net/tracker/index.php?func=detail&aid=440452&group_id=29872&atid=397617">440452</a>
The number() function accepts strings containing '+' and 'e'</li>
<li><a href="http://sourceforge.net/tracker/index.php?func=detail&aid=440992&group_id=29872&atid=397617">440992</a>
Identity transform fails</li>
<li><a href="http://sourceforge.net/tracker/index.php?func=detail&aid=441000&group_id=29872&atid=397617">441000</a>
date:dayOfWeekInMonth() gives wrong answer</li>
<li><a href="http://sourceforge.net/tracker/index.php?func=detail&aid=441078&group_id=29872&atid=397617">441078</a>
Union on nodes in temporary trees eliminates nodes that aren't duplicates</li>
</ul>

<h3>EXSLT extension library</h3>

<p>The <b>exslt:function</b> element now implicitly declares the namespace
<code>http://exslt.org/functions</code> to be an extension namespace, so that
<bold>exslt:result</bold> is recognized. Similarly, <b>saxon:function</b>
implicitly declares <code>http://icl.com/saxon</code> to be an extension namespace.</p>


<H2>Changes in version 6.4.2 (2001-07-07)</H2>

<h3>Defects cleared</h3>

<p>For details of defects cleared in this release, see the project page
at SourceForge (<a href="http://www.sourceforge.net/projects/saxon">http://www.sourceforge.net/projects/saxon</a>).</p>

<h3>The document() function</h3>

<p>A failure to retrieve the identified URI, or a failure to parse the XML, is now treated
as a recoverable error. By default, the error is reported to System.err, and an empty
node-set is returned. As with other recoverable errors, you can change this by setting
the recovery policy (e.g. -w2 on the command line makes the error fatal), or by supplying
your own ErrorListener.</p>

<p>It is now possible for a user-defined URI Resolver to return a DocumentInfo object
directly. This is illustrated by the sample URI Resolver included in the TraxExamples
sample application, which is used to resolve URIs referring to simple text files.
(This applies only to the document() function; when used by xsl:include or xsl:import,
the URIResolver should return a SAXSource, StreamSource, or DOMSource).</p>

<h3>Error reporting</h3>

<p>XSLT 1.0 says that is an error to output a node other than a text node while evaluating xsl:comment,
xsl:attribute, or xsl:processing-instruction; the processor is allowed to recover by
ignoring the offending nodes and their descendants. Saxon previously recovered silently
from this error. At this release, this error is handled in the same way as other recoverable
errors: by default, it results in a warning message.</p>

<p>XML parsing failures detected in the source document or stylesheet are now directed
to the JAXP ErrorListener, unless a SAX errorHandler has been nominated.</p>

<p>A PrintStream can now be supplied to the standard error listener to define the
destination for error messages (the default is System.err).

<p>There has been some tidying-up of error messages, to prevent the same message being
output several times.</p> 

<h3>EXSLT Support</h3>

<p>The core extension functions defined in the EXSLT dates-and-times module are now
available: specifically date-time(), date(), time(), year(), leap-year(), month-in-year(),
month-name(), month-abbreviation(), week-number(), week-in-month(), day-in-year(),
day-in-month(), day-of-week-in-month(), day-in-week(), day-abbreviation(), 
hour-in-day(), minute-in-hour(), second-in-minute(). For details see
 <a href="http://www.exslt.org/">http://www.exslt.org/</a></p>

<H2>Changes in version 6.4.1 (2001-07-03)</H2>

<p>This was an emergency patch release of Instant Saxon only. It fixed a problem whereby
Instant Saxon would not run unless certain other JAXP software (for example,
 the Crimson parser) was present on the classpath.</p>

<H2>Changes in version 6.4 (2001-07-03)</H2>

<h3>Documentation</h3>

<p>I have given the <a href="api-guide.html">API Guide</a> a much needed overhaul,
including improved descriptions of the APIs for invoking XPath expressions from Java
code.</p>

<H3>Defects cleared</H3>

<p>The following errors were found version 6.3, and have been cleared.</p>

<TABLE>
  <TR>
    <TD vAlign=top>6.3/001</TD>
    <TD>If the match pattern in an <b>xsl:key</b> definition matches both element and
    attribute nodes, only the attributes will actually be indexed. (Present in all
    previous releases.)</p>
    </TD></TR>
  <TR>
    <TD vAlign=top>6.3/002</TD>
    <TD>If a Writer is supplied to receive the output of a transformation (when using the
    JAXP 1.1 API), Saxon has no control over the output encoding. It is therefore possible
    that the value of the encoding attribute written to the XML declaration will bear
    no relation to the actual encoding of the output file. As a partial fix to this, 
    Saxon now determines the encoding used by the Writer if it can (namely, if it is
    an OutputStreamWriter) and writes this encoding name to the XML declaration, ignoring
    any encoding that was requested in xsl:output or via the setOutputProperty() method.
    On my Windows configuration, this will generally result in the XML declaration saying
    encoding="Cp1252". The recommended circumvention to this problem is to supply an
    OutputStream for the output, rather than a Writer. (Present in all
    previous releases.)</p>
    </TD></TR>
  <TR>
    <TD vAlign=top>6.3/003</TD>
    <TD>It is not possible to call an external function that expects an argument of class
    com.icl.saxon.expr.FragmentValue (or any other subclass of NodeSetValue), even if the
    supplied argument is the correct class. [Fixed but not tested]. (Present in 6.3 only)</p>
    </TD></TR>
  <TR>
    <TD vAlign=top>6.3/004</TD>
    <TD>The <b>following</b> axis, starting at an attribute or namespace node, should include the descendants
    of the element that is the parent of the attribute or namespace node. It currently returns only the
    nodes that are on the following axis from the parent node. (Present in all previous
    releases.)</p>
    </TD></TR>
  <TR>
    <TD vAlign=top>6.3/005</TD>
    <TD>A NullPointerException occurs if a StreamSource is supplied without calling
    setSystemId(). (Present in 6.3 only)</p>
    </TD></TR>
  <TR>
    <TD vAlign=top>6.3/006</TD>
    <TD>A bug in the AElfred XML parser: if the DTD declares an element type as having
    element content, but an element of that type wrongly contains non-whitespace text,
    then AElfred simply ignores the offending text; it reports no error, and it doesn't
    report the text to the application. As a non-validating parser, AElfred should
    report the text content exactly as if the DTD declared the element as having mixed
    content. (Present in all previous releases.)</p>
    </TD></TR>
  <TR>
    <TD vAlign=top>6.3/007</TD>
    <TD>AElfred fails to detect and report a well-formedness error: specifically,
    when the source text contains the disallowed sequence ']]&gt;' immediately
    after an entity reference such as '&amp;lt;'. (Present in all previous releases.)</p>
    </TD></TR>
  <TR>
    <TD vAlign=top>6.3/008</TD>
    <TD>A keyword used as an operator (div, mod, and, or) cannot be used as a
    variable name within an XPath expression. (Present in all previous releases.)</p>
    </TD></TR>
  <TR>
    <TD vAlign=top>6.3/009</TD>
    <TD>When a Saxon tree is supplied as input to a transformation (as a DOMSource),
    and needs to be rebuilt in order to strip whitespace nodes, and when the target format
    is a standard tree rather than a tinytree, then a NullPointerException may occur when
    reading the children of the root node (after processing the children that exist).
    (Present in Saxon 6.3 only.)</p>
    </TD></TR>
  <TR>
    <TD vAlign=top>6.3/010</TD>
    <TD>The &AElig;lfred parser, after reading an external entity, does not close
    the input file. It has been reported that on the Microsoft platform this can
    result in the operating system keeping the file locked indefinitely, preventing
    other processes updating it. The fix for this problem closes the input stream
    or reader even if this was supplied by a user-supplied entity resolver.
    (Present in all previous releases.)</p>
    </TD></TR>
  <TR>
    <TD vAlign=top>6.3/011</TD>
    <TD>The TemplatesHandler (which allows a stylesheet to be built using SAX events)
    does not work. (Present since JAXP support was introduced.)</p>
  <TR>
    <TD vAlign=top>6.3/012</TD>
    <TD>The &AElig;lfred XML parser, when invoked with 
    http://xml.org/sax/features/namespace-prefixes set to true, does not
    report namespace declarations to the application as attributes on the
    startElement() call. This doesn't affect Saxon, because Saxon always sets
    this feature to false, but it may affect other applications using &AElig;lfred.
    (Present since Saxon 6.3: a side effect of the fix for bug 6.2.2/011.)</p>
  <TR>
    <TD vAlign=top>6.3/013</TD>
    <TD>Namespace aliasing (xsl:namespace-alias) on attribute names 
    does not work. The new attribute name that is generated will have the local part
    of the attribute name overwritten with the local part of the containing element
    name. (Present in all previous releases.)</p>
  <TR>
    <TD vAlign=top>6.3/014</TD>
    <TD>When calling an extension function that expects an argument declared
    as being of type java.lang.Object, a supplied string, number, or boolean is
    passed as an instance of an internal Saxon class, rather than being converted
    to a String, Double, or Boolean.</p>
</TABLE>

<h3>JAXP 1.1 support</h3>

<p>Saxon no longer sets itself as the default DocumentBuilderFactory for use when
building a DOM. This is because the Saxon DOM implementation, being read-only, is
suitable only for specialized use.</p>

<p>Saxon still sets itself as both the default XSLT transformer and the default SAX2
ParserFactory.</p>

<h3>FOP integration</h3>

<p>Saxon's FOP integration has been updated to use FOP 0.19.0</p>

<p>Two new attributes are available on the <b>xsl:output</b> and <b>xsl:document</b>
elements, for use when <code>method="saxon:fop"</code>:</p>

<ul>
<li><b>fop:renderer</b> specifies the name of a FOP Renderer class, for example
<code>fop:renderer="org.apache.fop.render.pdf.PDFRenderer"</code>.</li>
<li><b>fop:configuration</b> specifies the name of a FOP user configuration file, for
example <code>fop:configuration="c:\config\fop.xml"</code></li>
</ul>

<p>Here <b>fop:</b> is the prefix of a namespace whose URI must be
 <code>http://icl.com/saxon/fop</code></p>
 
<p>These two attributes have not been fully tested.</p>

<H3>Internal API changes and code reorganisation</H3>

<p>These changes are made partly to improve maintainability of the code, partly
to reduce its size, and partly to enable the future support of a wider variety of
data structures that the XPath implementation can access (for example, non-SAXON DOM
structures, databases, etc). Some of the changes will affect Java applications, 
especially those that make intimate use of internal Saxon implementation classes.</p>

<h4>The NodeInfo interface</h4>

<p>The main change is a major simplification of the <b>NodeInfo</b> interface,
greatly reducing the number of methods and subclasses that need to be implemented
to support a new kind of tree structure,
but hopefully without reducing the usability of the interface or the performance
of its implementations.</p>

<p>The interface classes that are subclasses of NodeInfo have been eliminated,
(for example the old favorite <b>ElementInfo</b>).
The only exception is <b>DocumentInfo</b> (representing the root node or the document as a whole).
This reflects the fact that in the XPath data
model, all methods are available on any kind of node.
Tests that were previously
written <code>if (node instanceof TextInfo)</code> should now be written
 <code>if (node.getNodeType()==NodeInfo.TEXT)</code>. In other cases,
 simply replace the specific interface (for example ElementInfo) by the general
 class NodeInfo.</p>

<p>The <b>NodeInfo</b> interface, which is the main interface to Saxon's tree model,
no longer extends the DOM <b>Node</b> interface. This means that methods such as
getNextSibling() are no longer available on this interface. Navigation from a node 
should be done instead by
creating an enumeration using one of the XPath axes, using the <b>getEnumeration()</b> method.</p>

<p>However, the two implementations of the NodeInfo interface, that
is the standard tree and the tiny tree, continue to implement the DOM Node interface. 
To achieve this, the two implementation types (NodeImpl and TinyNodeImpl) both inherit
from a new abstract class called <b>AbstractNode</b>. This class implements both the Saxon NodeInfo
interface and the DOM Node interface; it also includes methods needed only for element, text, comment,
or root nodes. (This is done to make these methods shared between the two tree implementations:
it is not possible in Java for a class such as TextImpl to inherit both from
NodeImpl containing the Saxon methods and from a generic AbstractTextImpl containing the
DOM methods.)</p>

<p>The NodeInfo class now implements the JAXP <b>Source</b> interface, which means that any
NodeInfo can be used directly to define the source of a transformation, with no need to wrap it
in a DOMSource object. Note that if you supply the source tree in this way, it is your own
responsibility to strip any unwanted whitespace nodes before XSLT processing begins. The xsl:strip-space
and xsl:preserve-space instructions in the stylesheet will be ignored.</p>

<p>Saxon still uses DOM methods such as getNextSibling() to navigate the stylesheet tree,
which is always implemented using the standard tree model. However, Saxon no longer relies on
 the source document providing DOM interfaces.</p>

<p>As well as the DOM methods, a number of other methods on the NodeInfo interface
 have been removed. Many of these were "shortcut" methods that weren't really needed, and 
 which were the same in all implementations. In all cases there are alternatives available.</p> 
 
<p>The <b>getValue()</b> method in the NodeInfo class has been renamed <b>getStringValue()</b>,
to better reflect its meaning, and to avoid clashing with the getValue() method of the
org.w3c.dom.Attr class.</p>

<p>The <b>AxisEnumeration</b> classes are now logically part of the tree implementation,
so they are implemented differently for each tree structure. This allows
the implementation to use the navigation mechanisms that are most efficient in each
data structure.</p>

<p>The subclasses of <b>Axis</b>, which existed essentially to provide information about each
axis, have been removed. Instead the Axis class itself provides this information in the
form of a number of arrays, indexed by axis number. The Axis class has been moved to
the com.icl.saxon.om package.</p>

<p>The unused utility methods in class com.icl.saxon.om.Navigator, for example
isFirstInGroup() and getAncestor(), have been deleted. If you need these methods in your
application, I suggest reconstructing them within your application code, based on the
Saxon 6.3 source code.</p>

<p>The interface <b>com.icl.saxon.om.ExtendedAttributes</b> has been removed from the
object model, as the preferred way of accessing all the attributes of an element is now
to enumerate the attribute axis.</b>

<h4>Multiple documents</h4>

<p>In previous releases, certain information held within a document was required to be
unique across all documents used within a single transformation: in particular, the
document number, and the node sequence numbers. This potentially causes problems
when the same source document is used in multiple transformations, perhaps running in 
parallel. The problems were previously avoided by rebuilding the document for each
transformation, which is inefficient.</p>

<p>In Saxon 6.4, a document no longer contains a unique document number. The methods
generateId() and getSequenceNumber() now generate numbers which are required to be
unique only within a single document; making them globally unique is done by the
calling code, with the aid of the document pool maintained by the Controller.</p>

<p>A tree implementation is no longer required to provide sequence numbers for the nodes.
Instead, it is required to implement a compareOrder() method that determines the relative
ordering of two nodes within the same tree. Comparison of nodes in separate trees is
now done at a different level of the software.</p>

<p>The only extra data that a source document now contains to support Saxon transformations
is:</p>

<ul>
<li>A reference to the NamePool used to translate between the string representations of 
node names and their numeric representations;</li>
<li>A reference to the indexes that implement key structures. These are indexed by an
internal identifier for the key definition within the stylesheet. Key definitions in 
different stylesheets will always have different internal identifiers, but if the same
source document is transformed repeatedly using the same stylesheet (typically with
different parameters), the indexes can now be re-used.</li>
</ul>


<h4>The NodeHandler interface</h4>

<p><b>NodeHandler</b> was previously an abstract class in package com.icl.saxon.handlers;
it is now an interface in package com.icl.saxon. This may affect user-written node handlers,
used either in a Java (non-XSLT) application, or via the <b>saxon:handler</b> extension element.</p>

<p>There is an extra method <b>requiresStackFrame()</b> whose value is a boolean. You can generally
return false. Return true only if the node handler maintains variables or parameters that can be
 accessed from XPath expressions - something that is not especially easy to do.</p>

<p>This change also means that any user-written <b>TraceListener</b> will need to be recompiled.</p>

<h4>Sorting</h4>

<p>I have made internal changes to the sorting routines to reduce the memory used,
especially when the sort involves only a single sort key. The changes are unlikely to affect
many users. However, some of the methods in internal classes such as <b>SortedSelection</b> have changed.</p>

<h3>JDOM support</h3>

<p>To illustrate the way that the new NodeInfo interface can be used to create
adapters for other document formats, I have built an adapter for JDOM (see
<a href="http://www.jdom.org/">http://www.jdom.org/</a>). Although the code for this is included in the
main source tree, it is issued in a separate Jar file, saxon-jdom.jar. The code
is still at beta quality. A sample
application showing how to use Saxon with JDOM is provided. The JDOM interface
requires JDK 1.2.</p>

<p>This facility allows a JDOM tree to be used as the input to an XSLT transformation,
or as the target for XPath expressions issued from your Java code. You can direct the
output to a JDOM tree by using JDOM's SAX driver as the SAXResult destination object
for the transformation.</p>

<p>Saxon currently makes no attempt to merge adjacent text nodes in the JDOM tree:
these can arise if the two text nodes are separated by an entity boundary or by a CDATA
section boundary.</p>

<p>Using SAXON with JDOM is not likely to be especially efficient; it requires extra 
memory for the wrapper data structures, and some XPath navigation routes are quite
inefficent because they are not supported directly in JDOM
(for example, JDOM provides no direct way of getting
from a node to its siblings). It is provided partly as an illustration of how to 
interface other data sources, and partly for users who already have data in JDOM 
format. It is particularly useful to enable XPath access to JDOM from Java applications.</p>

<H3>&AElig;lfred XML parser</H3>

<p>I have reviewed the changes made by David Brownell in his version of the 
&AElig;lfred XML parser (available as project xmlconf in www.sourceforge.net),
and have incorporated those that are relevant into the Saxon version. This is
basically all changes except those required to report validation errors. Most
of the changes are very minor, but there are some enhancements in the handling
of character encoding: if an input file is in an encoding that &AElig;lfred itself
does not understand, it now attempts to get the Java VM to decode it. The set of
character encodings available in the Java VM is platform-dependent.</p>

<h3>SQL extension functions</h3>

<p>Following a suggestion from Ren&eacute; Jansen, I have changed the <code>xsl:insert</code>
code so it now prepares the SQL statement only the first time it is executed, and reuses
the prepared statement thereafter. Also, it can now handle columns that are not strings.</p>

<h3>xsl:attribute and friends</h3>

<p>The three instructions xsl:attribute, xsl:comment, and xsl:processing-instruction
have been speeded up. Where the content of the instruction is a single text node, or
an xsl:value-of instruction, Saxon now avoids the overead of setting up a new output
destination; instead of processing the content as a general template body, it evaluates
it directly as an expression. Where this is not the case, a streamlined output method
is used that avoids many of the overheads previously incurred.</p>

<h3>Variables and parameters</h3>

<p>Global variables and parameters are no longer evaluated if there is another variable
or parameter with the same name and higher import precedence.</p>

<p>An xsl:variable element containing a single text node is now treated specially, bringing
the performance close to that of a String variable.</p>

<H2>Changes in version 6.3 (2001-05-03)</H2>

<H3>JAXP 1.1</H3>

<p>Saxon now implements the <b>javax.xml.parsers</b> package in JAXP 1.1 as well as the
javax.xml.transform package.</p>

<p>If you have the system property <b>javax.xml.parsers.SAXParserFactory</b> set to the value
<b>com.icl.saxon.aelfred.SAXParserFactoryImpl</b>, then any call on JAXP 1.1 interfaces to get
an XMLReader will select AElfred. Moreover, Saxon itself uses the JAXP 1.1 interfaces
to get an XMLReader if none has been explicitly requested, so you can now determine the
parser to be used by setting this system property. The default for this property, defined
by a services file in saxon.jar, selects the AElfred parser.</p>

<p>Similarly, if you have the system property <b>javax.xml.parsers.DocumentBuilderFactory</b> set to the value
<b>com.icl.saxon.om.DocumentBuilderFactoryImpl</b>, then any call on JAXP 1.1 interfaces to get
a DOM Document builder will select the Saxon tinytree implementation. However, Saxon
does not call JAXP interfaces to get a Document builder: it will always choose its own.
Note that Saxon's DOM implementation is an immutable DOM: you can construct the DOM by
parsing a source document, but you cannot build it or modify it through the DOM API 
methods.</p>

<p>Saxon's <b>Builder</b> and <b>Stripper</b> classes have been moved to the package
 com.icl.saxon.om.</p>
 
<p>When a Saxon document is supplied as input to the <b>transform()</b> method (using a
DOMSource object), in previous releases the tree was rebuilt. At this release the tree
is used <i>as is</i>, provided that either (a) the stylesheet does not require
whitespace nodes to be stripped, or (b) whitespace stripping has been disabled by
calling the new <b>Controller.disableWhitespaceStripping()</b> method. In the cases where the
tree does need to be rebuilt, a "fast path" routine has been introduced to do this:
previously the same code was used as for a third-party DOM, which incurred unnecessary
costs because there are so many different ways namespaces can be represented in a DOM.</p>

<p> When performing multiple
transformations on a single source document, it is best to do the whitespace stripping
once as a separate operation: 
this is made possible by a new method <b>PreparedStyleSheet.stripWhitespace()</b>, which
uses the xsl:strip-space directives in a stylesheet to remove whitespace from a document
(in fact, it returns a new document that is a copy of the original, with relevant
whitespace nodes removed; if no whitespace stripping needs to be done, it returns
the original document unchanged).</p>

<p>It is now possible to supply a Saxon document as the output of a transformation.
(This didn't work at previous releases, though the restriction was undocumented.) The
document must be empty, and the node supplied in the DOMResult object must be the
document (ie. root) node.</p>

<p>It is now possible to start a transformation at a node other than the root node,
if the input is supplied in the form of a DOM (in a DOMSource object).
Global variables are still evaluated with the root node as context node, and the entire
tree is available to the transformation, but the first template rule applied is not,
as is usual, the <b>match="/"</b> rule, but the rule that matches the supplied node. The DOM
supplied as input must not contain CDATA or entity reference nodes that are parents
or preceding siblings of the start node.</p> 

 
<H3>Extension Functions</H3>

<p>Saxon's support for Java extension functions has been brought into line with
the working draft XSLT 1.1 specification.</p>

<p><b>Polymorphic methods</b> are now fully supported. If the relevant class has
 several methods (or constructors) with the same name, the one that is chosen
 is the one that gives a "best match" to the types of the supplied arguments,
 following the rules in the XSLT 1.1 draft. If there is no unique method that
 provides a best match according to these rules, an error is reported.</p>
 
<p>Methods that return void, null, char, or byte are now handled as described
in the XSLT 1.1 working draft.</p>

<p>There is still a restriction that extension functions cannot construct
a new DOM tree and return nodes from this tree by using DOM methods.
They can only return existing nodes that were constructed by Saxon itself.</p>

<p>Methods that expect a node-set as input can now declare the argument type
as com.icl.saxon.expr.NodeEnumeration, as an alternative to com.icl.saxon.expr.NodeSetValue.
This is likely to be a bit more efficient. The enumeration will always be positioned
at the start when the function is called, and its position on exit can be anywhere.
It is also possible to return a NodeEnumeration as the result of a function. Again,
the enumeration must be positioned at the start. Returning a NodeEnumeration is
especially efficient if the result is then converted to a String or a Boolean.</p>

<p>The rules for spelling of external function names have been brought into line with
XSLT 1.1. <b>This may require stylesheet changes.</b> For example, the function
has-same-nodes() must now be spelt as "has-same-nodes()" or "hasSameNodes()", it
can no longer be spelt as "hassamenodes()" or as "HAS-SAME-NODES()". For
backwards compatibility, the node-set() function may be spelt with or without
the hyphen (or as "nodeSet()").

<H3>EXSLT</H3>

<p><a href="http://www.exslt.org/">EXSLT</a> is
 an initiative to define a standardized set of extension functions 
and extension elements that can be used across different XSLT processors.</p>

<p>Saxon now supports the EXSLT modules Common, Math, Sets, an Functions. 
The full list of extension functions is:</p>

<ul>
<li>exslt:node-set()</li>
<li>exslt:object-type()</li>
<li>math:min()</li>
<li>math:max()</li>
<li>math:highest()</li>
<li>math:lowest()</li>
<li>set:difference()</li>
<li>set:intersection()</li>
<li>set:distinct()</li>
<li>set:leading()</li>
<li>set:trailing()</li>
<li>set:has-same-node()</li>
</ul>

<p>plus the following new elements:

<ul>
<li>func:function</li>
<li>func:result</li>
</ul>


<p>These have considerable overlap with functions that have previously been
provided in the Saxon namespace. The Saxon versions of the functions remain available,
for the time being, but the EXSLT versions are preferred.</p>

<p>The saxon:function and saxon:return elements have been changed slightly to conform to the EXSLT
rules. Specifically: saxon:return can now appear inside xsl:for-each, provided the xsl:for-each iterates
at most once. There is now a check that saxon:return is not used inside the definition of
a variable or inside another saxon:return. It is an error to instantiate more that one
saxon:return within a function.</p>

<h3>saxon:closure</h3>

<p>Following a suggestion from Christian Nentwich, I have implemented a new extension
function saxon:closure(), which forms a node-set by taking the transitive closure of
a node-set expression. The function does NOT detect cycles.</p>

<H3>Defects cleared</H3>

<p>The following errors were found version 6.2.2, and have been cleared.
Many of these relate to incorrect handling of error cases, and reflect the fact
that I have greatly increased the test coverage of error handling.</p>

<TABLE>
  <TR>
    <TD vAlign=top>6.2.2/001</TD>
    <TD>If the first argument of the key() function is not the name of a key defined in the
    stylesheet, a diagnostic dump is produced in place of a meaningful error message.
    </TD></TR>
  <TR>
    <TD vAlign=top>6.2.2/002</TD>
    <TD>If the name attribute of the xsl:call-template instruction is not the name of a template defined in the
    stylesheet, a diagnostic dump is produced in place of a meaningful error message.
    </TD></TR>
  <TR>
    <TD vAlign=top>6.2.2/003</TD>
    <TD>No error is reported when the use-attribute-sets attribute of xsl:attribute 
    contains a circular reference. (Instead, the stack overflows). Note: the fix for
    this only detects the error at run-time if the attribute-set is actually used. Technically, the
    error should be detected at compile time, and reported even if the attribute set is never used.
    </TD></TR>
  <TR>
    <TD vAlign=top>6.2.2/004</TD>
    <TD>No error is reported when the xsl:include or xsl:import element is non-empty.
    </TD></TR>
  <TR>
    <TD vAlign=top>6.2.2/005</TD>
    <TD>A null pointer exception occurs if the href attribute of xsl:import or xsl:include
    is omitted.
    </TD></TR>
  <TR>
    <TD vAlign=top>6.2.2/006</TD>
    <TD>No error is reported if a template name, variable name, or mode name does not
    conform to the lexical rules for a QName.
    </TD></TR>
  <TR>
    <TD vAlign=top>6.2.2/007</TD>
    <TD>No error is reported if the xsl:key element is non-empty.
    </TD></TR>
  <TR>
    <TD vAlign=top>6.2.2/008</TD>
    <TD>No error is reported if the xsl:attribute-set element has content other than
    xsl:attribute elements.
    </TD></TR>
  <TR>
    <TD vAlign=top>6.2.2/009</TD>
    <TD>An ArrayIndexOutOfBounds exception occurs when attempting to get the children
    of the last node in the document, if the number of nodes in the document is 4000
    times a power of two. Applies to the TinyTree model only. The problem occurred when
    using preview mode.
    </TD></TR>
  <TR>  
    <TD vAlign=top>6.2.2/010</TD>
    <TD>When the AElfred parser attempts to read a file using the http protocol, the 
    encoding specified in the HTTP header should take precedence over the encoding
    specified in the XML document declaration. However, the parsing of the HTTP header
    is incorrect, so the encoding is typically identified as "=UTF-8" rather than "UTF-8".
    This results in an UnsupportedEncodingException.
    </TD></TR>
  <TR>
    <TD vAlign=top>6.2.2/011</TD>
    <TD>There is an error in namespace handling in the AElfred parser. When a "real"
    attribute precedes a namespace declaration in an element start tag, and the QName
    of the element or of an attribute is the same as the QName of the parent element
    or one of its attributes, then the namespace URI assigned to the name may be based
    on the namespace declarations in force for the parent element rather than those for the
    child element.
    </TD></TR>
  <TR>
    <TD vAlign=top>6.2.2/012</TD>
    <TD>There is a bug in the current version of JAXP 1.1: when a StreamSource is
    constructed from a File object, and the filename is of the form "/usr/file.xml",
    the resulting URL is "file:////usr/file.xml" rather than "file:///usr/file.xml".
    I have added code to Saxon's TransformerFactoryImpl to circumvent this problem
    by detecting the incorrect URL and patching it.
    </TD></TR>
  <TR>
    <TD vAlign=top>6.2.2/013</TD>
    <TD>User-written message emitters don't work.
    </TD></TR>
  <TR>
    <TD vAlign=top>6.2.2/014</TD>
    <TD>The integer value returned by getNodeType() on a root node is not consistent
    with the DOM specifications. <b>Applications that call this method should be recompiled</b>.
    </TD></TR>
  <TR>
    <TD vAlign=top>6.2.2/015</TD>
    <TD>With xsl:output method="html" indent="yes", indentation should be suppressed for
    output elements that are nested within a &lt;pre&gt; element. It isn't.
    </TD></TR>
  <TR>
    <TD vAlign=top>6.2.2/016</TD>
    <TD>When an invalid property is passed to the Transformer methods setOutputProperty()
    or setOutputProperties(), an IllegalArgumentException should be thrown. Instead, the
    value is silently ignored.
    </TD></TR>
  <TR>
    <TD vAlign=top>6.2.2/017</TD>
    <TD>When getOutputProperties() is called on the Transformer interface, subsequent changes
    to the returned properties should have no effect. This isn't currently the case, as the
    method returns a reference to the internal property set, rather than making a copy.
    </TD></TR>
  <TR>
    <TD vAlign=top>6.2.2/018</TD>
    <TD>When processing a document containing attributes with undeclared namespace prefixes,
    Saxon may crash with a NullPointerException after reporting the error.
    </TD></TR>
  <TR>
    <TD vAlign=top>6.2.2/019</TD>
    <TD>On return from a call of xsl:apply-imports, the current template is not reset. This
    means that a second call on xsl:apply-imports will invoke the wrong template.
    </TD></TR>
</TABLE>

<H2>Changes in version 6.2.2 (2001-03-15)</H2>

<p>Upgraded to the latest JAXP ("version 1.1 final release") dated 6 Feb 2001. Saxon now
uses the JAXP binaries exactly as issued by SUN. Unfortunately the TransformerFactory
issued by Sun invokes Xalan as the "platform default" XSLT processor. The saxon.jar
file includes a META-INF file to override this, so there should be no problems unless
you have other things on the classpath that conflict. If you want to be absolutely
sure of loading Saxon rather than any other XSLT processor, set the system property
javax.xml.transform.TransformerFactory to the value "com.icl.saxon.TransformerFactoryImpl",
either from your application (by calling System.setProperty()), or from the command line
(java -Djavax.xml.transform.TransformerFactory=com.icl.saxon.TransformerFactoryImpl classname)</p>

<p>Make sure you remove any older versions of jaxp.jar from your classpath to prevent any
incompatibilities.</p>

<p>I have changed the packaging of the FOP integration, to reduce the problems this
causes for people who want to rebuild Saxon or load it into a development environment
such as IBM's Visual Age for Java. The FOP integration module, FOPEmitter, is now part
of a separate package, com.icl.saxon.fop, and is not included in saxon.jar, but is in
a separate JAR file, saxon-fop.jar. This must be on the class path if you want to use
Saxon with FOP, but you can ignore it otherwise. There are no longer any compile-time
references to FOPEmitter from the rest of the Saxon code, so you can recompile the
product without first installing FOP, provided that you remove FOPEmitter from the
source library first.</p>

<p>I have reinstated the ability to call Java extension functions using the namespace
xmlns:ext="full.class.Name" as an alternative to xmlns:ext="java:full.class.Name".
However, the "java:" form is preferred.</p>

<p>I added extension functions saxon:before() and saxon:after(), based on the BEFORE and
AFTER operators defined in XQuery. These take two node-sets as arguments and return
all the nodes in the first node-set that are before/after at least one node in the second
node-set, in document order. This provides an alternative to saxon:leading(), e.g.
saxon:before(*, s[1]) gets all the child elements that precede the first child &lt;s&gt;
element.</p>

<p>A further refinement to class loading: if the loader returned by getContextClassLoader()
fails to load a class, we now try to load the class using Class.forName(). This is all
something of a black art: different things appear to work in different environments.</p>

<p>I have re-instated <b>saxon:output</b> as a synonym of <b>xsl:document</b>. The reason
for this is that some XSLT processors object to finding an xsl:document element in
the stylesheet, even when running in forwards compatible mode. Using saxon:output is
therefore more portable. Note, however, that the new saxon:output is not completely
compatible with the old: attribute names have changed, especially "file" to "href".</p>

<H3>Defects cleared</H3>

<p>The following errors were reported for version 6.2.1, and have been cleared:</p>

<TABLE>
  <TR>
    <TD vAlign=top>6.2.1/001</TD>
    <TD>An error is reported if, in an XPath expression, one of the symbols "*",
    "div", "mod", "and", or "or" is used immediately after a comma (that is, as
    an argument in a function call after the first). The symbol is wrongly interpreted
    as a binary operator rather than a location path. (Present in all previous
    releases).
    </TD></TR>
  <TR>
    <TD vAlign=top>6.2.1/002</TD>
    <TD>The expression select="@prefix:*", which should return all attributes in the
    given namespace, actually returns all attributes regardless of namespace.
    </TD></TR>
  <TR>
    <TD vAlign=top>6.2.1/003</TD>
    <TD>When a user-specified trace listener is specified using the -TL option on the
    command line, line numbering should automatically be switched on; but the attempt to do 
    so fails.
    </TD></TR>
  <TR>
    <TD vAlign=top>6.2.1/004</TD>
    <TD>If the stylesheet contains more than one xsl:script element, Saxon may attempt
    to load the wrong Java class. This will usually result in no appropriate method
    being found.
    </TD></TR>
  <TR>
    <TD vAlign=top>6.2.1/005</TD>
    <TD>In the message reporting an ambiguous template rule match, a pattern that is a
    union pattern with three or more components is displayed incorrectly as "null". 
    </TD></TR>
  <TR>
    <TD vAlign=top>6.2.1/006</TD>
    <TD>A null pointer exception occurs when the name of a system function is misspelt.
    </TD></TR>
  <TR>
    <TD vAlign=top>6.2.1/007</TD>
    <TD>In setting up the SAX2 parser, Saxon fails to state that it requires both the
    "features/namespaces" and "features/namespace-prefixes" features to be on. A SAX2 XMLReader
    may therefore fail to supply Saxon with information about namespaces, causing the
    transformation to produce incorrect results.
    </TD></TR>
  <TR>
    <TD vAlign=top>6.2.1/008</TD>
    <TD>A null pointer exception occurs when the -a option is used and the source document
    contains no suitable &lt;?xml-stylesheet?&gt; processing instruction.
    </TD></TR>
  <TR>
    <TD vAlign=top>6.2.1/009</TD>
    <TD>The get/set OutputProperties() methods on the Templates and Transformer objects
    do not work as described in the TrAX interface. On the Templates object, getOutputProperties()
    returns only those values explicitly set in the stylesheet, not the XSLT-defined defaults.
    On the Transformer object, getOutputProperties() only returns properties that have been
    explicitly set using setOutputProperties(). 
    </TD></TR>
  <TR>
    <TD vAlign=top>6.2.1/010</TD>
    <TD>In an XPath expression, Saxon reports no error when whitespace is used between a "$"
    sign and the following variable name. No space is allowed in this position.
    </TD></TR>
  <TR>
    <TD vAlign=top>6.2.1/011</TD>
    <TD>In an XPath expression, Saxon reports no error when a colon is used between a
    function name or node-type name and the following left parenthesis,
    if it is separated from the function name by whitespace. 
    For example, no error is reported for "true :()" or "node :()".
    </TD></TR>

</TABLE>
    
<H2>Changes in version 6.2.1 (2001-02-20)</H2>

<p>Support for <a href="using-xsl.html#Applet">Running Saxon in an Applet</a>: I have shamelessly copied the
XSLTProcessorApplet module from Xalan, which was written to run any TrAX processor
from a Java applet, and have adapted it to work with Saxon. The only changes were to
remove a call on a Xalan error-handling routine, and to change the package name.
I have also copied and adapted the Xalan sample application which shows how to
incorporate this applet into an HTML page. To run a transformation using Saxon
requires saxon.jar to be downloaded to the client. At 550Kb this is fairly substantial.</p>

<p>There are some <a href="samples.html#applet">sample applications</a> using Saxon as an applet in 
the samples/applet folder.</p> 

<p>It is now possible to specify the CharacterSet class to be used for a named output
encoding by setting the system property, e.g. -D"encoding.EUC-JP"="EUC_JP"; the value
of the property should be the name of a class that implements the
PluggableCharacterSet interface.</p>

<p>Saxon has been modified to work with FOP 0_17_0; it no longer works with earlier versions
of FOP. This has required some extensions to the Emitter interface, to cater for the fact that
FOP now requires an OutputStream rather than a Writer as its output destination. Note also
that FOP attempts to load Xerces as its default XML parser; if you want to use Saxon's AElfred
parser istead, set the system property -Dorg.xml.sax.parser=com.icl.saxon.aelfred.SAXDriver.
To run FOP, include the supplied JAR files fop.jar and w3c.jar on your classpath (FOP uses
the DOM SVG package which is not included in saxon.jar).</p>  

<H3>Defects cleared</H3>

<p>The following errors were reported for version 6.2, and have been cleared:</p>

<TABLE>
  <TR>
    <TD vAlign=top>6.2/001</TD>
    <TD>When no implementation of an extension element is available, a compile-time
    error is reported, whether or not the element is actually instantiated. (Circumvention:
    add the attribute xsl:version="99" to the extension element).
    </TD></TR>
  <TR>
    <TD vAlign=top>6.2/002</TD>
    <TD>When no implementation of an extension function is available, a compile-time
    error is reported, whether or not the function is actually instantiated. (Circumvention:
    add the attribute xsl:version="99" to a literal result element enclosing the call
    on the offending function).
    </TD></TR>    
  <TR>
    <TD vAlign=top>6.2/003</TD>
    <TD>The sample extension for SQL provides no way of closing the database connection.
    With some configurations, this leads to updates being lost. I have therefore added
    another extension element, <b>sql:close</b>.
    </TD></TR>    
  <TR>
    <TD vAlign=top>6.2/004</TD>
    <TD>If a user-supplied URIResolver is registered with the TransformerFactory, it is
    not used when resolving the URI contained in the href pseudo-attribute of the xml-stylesheet
    processing instruction.
    </TD></TR>   
  <TR>
    <TD vAlign=top>6.2/005</TD>
    <TD>When the namespace attribute of xsl:element or xsl:attribute evaluates to an
    empty string, the specification states that the namespace of the resulting element
    or attribute should be null. Saxon wrongly generates a namespace declaration of the
    form xmlns:prefix="".
    </TD></TR>   
  <TR>
    <TD vAlign=top>6.2/006</TD>
    <TD>Under some circumstances using a local variable in an expression constructed using
    saxon:evaluate() or saxon:expression() fails, saying the variable has not been declared.
    The failure only occurs when the xsl:variable element declaring the variable is a
    sibling of the element containing the attribute containing the call on saxon:evaluate
    or saxon:expression. You can therefore circumvent the problem by wrapping the relevant
    element inside &lt;xsl:if test="true()"&gt;.
    </TD></TR>  
  <TR>
    <TD vAlign=top>6.2/007</TD>
    <TD>If the context node is an attribute node or namespace node, the preceding
    and following axes (like preceding-sibling and following-sibling)
    are empty.
    </TD></TR>      
  <TR>
    <TD vAlign=top>6.2/008</TD>
    <TD>The output properties set using xsl:output in the stylesheet are not accessible
    using the getOutputProperty() method of the Transformer. (Circumvention: they are
    available from the getOutputProperty() of the Templates object).
    </TD></TR>     
  <TR>
    <TD vAlign=top>6.2/009</TD>
    <TD>Calling an external function that declares an argument of type org.w3c.dom.NodeList
    may fail with an exception, if the node-set supplied in the function call has not been
    fully evaluated (specifically, if it is a NodeSetIntent).
    </TD></TR>    
  <TR>
    <TD vAlign=top>6.2/010</TD>
    <TD>Saxon does not report an error when the stylesheet contains two conflicting 
    definitions of the default decimal format; it simply uses the one that comes last.
    </TD></TR>    
  <TR>
    <TD vAlign=top>6.2/011</TD>
    <TD>Saxon reports inadequate diagnostics when an XML parsing failure occurs while
    looking for an xml-stylesheet processing instruction: specifically, if the failure
    is a "file not found" error that arises while resolving references to external entities
    or to the document's external DTD. The only output is the message 
    "TrAX Transform Exception".
    </TD></TR>   
</TABLE>    


<H2>Changes in version 6.2 (2001-02-06)</H2>

<H3>Towards XSLT 1.1</H3>

<p>The <b>xsl:script</b> element is now available. It is ignored unless the language is "java".
This element can be used to identify the Java class
implementing an extension function as defined in the XSLT 1.1 specification. The 
<b>archive</b> attribute can be used to specify a list of URLs to be searched,
but only with a JVM that supports JDK 1.2 interfaces (i.e. not with the Microsoft JVM, and therefore
not with Instant Saxon).
 NOTE: the rules
for selecting a method within this class are unchanged. In particular, where there are several
methods with the same name and number of arguments, it is not predictable which will be chosen.
The native Saxon techniques for identifying a Java class will continue to be used if there
is no xsl:script element for the relevant prefix, with one exception: the form 
<code>xmlns:prefix="fully.qualified.ClassName"</code> is no longer supported; use
<code>xmlns:prefix="java:fully.qualified.ClassName"</code> instead.</p>

<p>The element name <b>saxon:script</b> can be used as a synonym of <b>xsl:script</b>. The
advantage of using saxon;script is that other processors will ignore it. This allows you to
define the way Saxon will implement an extension function which may be different from the
way other processors implement it. This is epecially useful if your stylesheet uses functions
such as xx:intersection() which are now offered by several different XSLT processors.
Note that the built-in Saxon extension functions are all implemented in the same way as
user extension functions, in class com.icl.saxon.functions.Extensions; so you can use
<b>src="java:com.icl.saxon.functions.Extensions"</b> to locate the Saxon implementation
of these functions.</p>

<p>The Saxon class com.icl.saxon.Context now implements the <b>org.w3c.xsl.XSLTContext</b>
interface, as defined in the XSLT 1.1 working draft. This can now be used as the first
argument of a method that implements an
extension function (but you can continue to use com.icl.saxon.Context if you prefer).
A consequence of this change is that getContextNode() and getCurrentNode() now return a
org.w3c.dom.Node rather than a com.icl.saxon.om.NodeInfo; if you want to use Saxon methods
on the returned node, you will have to cast it to a NodeInfo. Note that although the
getOwnerDocument() method of XSLTContext is implemented, the resulting document will
not be updateable.</p>

<p>The <b>xsl:apply-imports</b> element may now take parameters, that is, it may have
child <b>xsl:with-param</b> elements.</p>

<p>The <b>xml:base</b> attribute is implemented. This can be used to change the base URI of
an element (in either the source document or the stylesheet) for the purposes of the
document() function. A new extension function is provided (largely for diagnostic purposes):
saxon:base-uri() returns the base URI of the context node. Note that the terms "base URI"
and "system ID" have in the past been used synonymously. This has been tidied up. The
System ID refers to the entity (ie. file) in which an element was found, and is useful
for diagnostics in conjunction with the line number. The Base URI defaults to the System ID,
but may be changed using xml:base, and is used for resolving relative URIs appearing in
calls to document() or to xsl:include and xsl:import.</p>

<p>If you supply your own URIResolver, you can use the base URI any way you like. For example,
if the relative URI is the key of a record in a database, you could use the base URI to
hold information identifying the database, e.g. the JDBC connection details.</p>


<H3>Performance</H3>

<p>I have changed the algorithm used for <b>generate-id()</b>. The existing algorithm was very 
inefficient, which was proving a problem with Muenchian grouping algorithms that rely on
this function. It performed particularly badly when using the tinytree data structure with
a large source document. The new algorithm is much faster, especially with the tinytree structure.
It produces different results from the old algorithm, and is different for the two tree
implementations.</p>


<H3>Defects cleared</H3>

<p>The following errors were reported for version 6.1, and have been cleared:</p>

<TABLE>
  <TR>
    <TD vAlign=top>6.1/001</TD>
    <TD>Tail recursion is invoked when it should not be, for example if an xsl:call-template
    instruction is issued from within a literal result element. Present since Saxon 5.3.
    </TD></TR>
   <TR>
    <TD vAlign=top>6.1/002</TD>
    <TD>A null pointer exception occurs after reporting the absence of the select attribute
    on the xsl:value-of instruction. The same error occurs in a number of other cases
    where absent attributes are reported. Present since Saxon 6.1.
    </TD></TR>   
   <TR>
    <TD vAlign=top>6.1/003</TD>
    <TD>An ArrayIndexOutOfBounds exception occurs in method outputNamespaceNodes when processing
    a large source document using the tinytree model. Present since Saxon 6.0.
    </TD></TR>   
   <TR>
    <TD vAlign=top>6.1/004</TD>
    <TD>When running in forwards compatibility mode (i.e. when the version attribute on xsl:stylesheet
    is not 1.0 or 1.1), unknown XSL elements appearing as top-level elements should be ignored.
    Instead, an error is reported.
    </TD></TR>   
   <TR>
    <TD vAlign=top>6.1/005</TD>
    <TD>When the outermost element of the stylesheet does not declare the XSLT namespace
    (for example, because it declares the Microsoft WD-xsl namespace instead), no specific diagnostics
    are output, just the message "Transformation failed". Present since Saxon 6.1.
    </TD></TR>   
   <TR>
    <TD vAlign=top>6.1/006</TD>
    <TD>The first namespace node for an element (typically the XML namespace) has the same
    internal identifier as it parent element, which means that when a node-set containing a
    mixture of element and namespace nodes is constructed, one of these will be wrongly
    eliminated as a duplicate. The problem applies only to the tinytree model. Present since
    Saxon 6.0.
    </TD></TR>   
   <TR>
    <TD vAlign=top>6.1/007</TD>
    <TD>When loading secondary input documents using the StandardURIResolver, the AElfred
    parser may be used rather than the one nominated to the TransformerFactory. Present since
    Saxon 6.1.
    </TD></TR>   
   <TR>
    <TD vAlign=top>6.1/008</TD>
    <TD>The logic for using the current directory as the fallback for resolving relative
    URIs when no other base URI is available fails on UNIX systems where the current directory
    is returned with a trailing "/". Present since Saxon 6.1.
    </TD></TR>   
   <TR>
    <TD vAlign=top>6.1/009</TD>
    <TD>With the TrAX API, when the result of a transformation is a DOMResult,
    if no user-created DOM was specified using setNode(), the processor is supposed to
    create the DOM document itself. No attempt is made to do so, instead Saxon fails with
    a null pointer exception. Present since Saxon 6.1.
    </TD></TR>   
   <TR>
    <TD vAlign=top>6.1/010</TD>
    <TD>The XPath expression //abc:xyz returns no nodes. This happens with the tinytree model
    only, when there is a non-null namespace URI. Present since Saxon 6.0.
    </TD></TR>   
   <TR>
    <TD vAlign=top>6.1/011</TD>
    <TD>The call TransformerFactory#getTransformerHandler() (with no arguments),
    which should return an identity
    transformer packaged as a SAX ContentHandler, returns an object that is not useable.
    Present since Saxon 6.1.
    </TD></TR>  
   <TR>
    <TD vAlign=top>6.1/012</TD>
    <TD>Errors occur when several Transformers derived from the same Templates object
    are run concurrently in multiple threads. (The problem is that they share the same
    Stripper, and this is used to hold information specific to the transformation).
    </TD></TR>  
   <TR>
    <TD vAlign=top>6.1/013</TD>
    <TD>The SAX2 driver for the AElfred parser always reports the first two arguments
    of the endElement() call (the namespace URI and prefix) as empty strings. When the
    parser is used within Saxon this has surprisingly few ill-effects; the only ones
    I am aware of are (a) when the an element with a non-null namespace is named in
    <b>saxon:preview</b>, and (b) when doing an identity transformation using the JAXP 1.1
    interface. Present since Saxon 5.3
    </TD></TR>  
   <TR>
    <TD vAlign=top>6.1/014</TD>
    <TD>No error is reported when <b>xsl:copy-of</b> is used as a top-level element.
    (At 6.1 the instruction is executed "successfully", placing its output at the start 
    of the output file. At previous releases a NullPointerException occurs).
    </TD></TR>  
   <TR>
    <TD vAlign=top>6.1/015</TD>
    <TD>When <b>xsl:copy-of</b> is used to copy a result tree fragment, and a top-level
    element in the result tree fragment uses the default namespace (xmlns=""), but the
    result tree at that point uses the default namespace with a non-null URI (xmlns="xxx"),
    then no namespace undeclaration (xmlns="") is written to the result tree, causing the
    top-level element to be in the wrong namespace.
    </TD></TR>  
   <TR>
    <TD vAlign=top>6.1/016</TD>
    <TD>When <b>xsl:document</b> attempts to create not only the output file but the
    directory it is in, using a Java VM earlier than JDK 1.2 (but not the Microsoft
    Java VM), it crashes with the message "java.lang.NoSuchMethodError: java.io.File: 
    method createNewFile()Z not found".
    </TD></TR>  
   <TR>
    <TD vAlign=top>6.1/017</TD>
    <TD>If a call is made within an XPath predicate to an extension function that
    uses context information, in particular the saxon:evaluate() extension function,
    the call may fail with a null pointer exception.
    </TD></TR>  
   <TR>
    <TD vAlign=top>6.1/018</TD>
    <TD>Errors in the [xsl:]exclude-result-prefixes and [xsl:]extension-element-prefixes
    attributes (for example, use of an undeclared namespace prefix) are poorly reported.
    In some cases the error triggers a null pointer exception, in others it is reported
    with an unhelpful message, and in some cases it is not reported at all.
    </TD></TR>  
   <TR>
    <TD vAlign=top>6.1/019</TD>
    <TD>With output method HTML, if elements are output as children of a script or style
    element, output escaping is switched on for that part of the script or style text
    that follows such an element. It should remain off for all the contents of the 
    script or style element.
    </TD></TR>  
   <TR>
    <TD vAlign=top>6.1/020</TD>
    <TD>A null pointer exception occurs when reporting an ambiguous template rule match,
    when one of the matching patterns is a simple node test such as "node()".
    </TD></TR>  
   <TR>
    <TD vAlign=top>6.1/021</TD>
    <TD>If an unsupported encoding is requested, Saxon correctly reverts to UTF-8, but
    the encoding specified in the XML declaration (or the HTML META element) of the output
    file is the one that was requested, not UTF-8 as actually used.
    </TD></TR>  
</TABLE>    


<H2>Changes in version 6.1 (2001-01-09)</H2>

<h3>Towards XSLT 1.1</h3>

<p>The <b>saxon:output</b> element is renamed <b>xsl:document</b>, and its <b>file</b>
attribute is renamed <b>href</b>. (At this stage, though, it still takes a filename
rather than a URI). The next-in-chain attribute is renamed saxon:next-in-chain and is
now available on both xsl:output and xsl:document. The href attribute is mandatory:
if saxon:next-in-chain is also present, ot determines the destination of the output
of the chained stylesheet. The indent attribute must now be
either "yes" or "no"; the previous option to specify the level of indentation is now
replaced by saxon:indent-spaces="<i>integer</i>", on both xsl:output and xsl:document.
The omit-meta-tag and character-representation attributes, similarly, are
prefixed "saxon:" and are available on both elements.</p>

<p>The xsl:output element (like xsl:document) now allows all its attributes to be
 specified as attribute value templates.</p>
 
<p>A side-effect of this change is that xsl:output properties are now ignored when running
in preview mode, because the properties cannot be evaluated until the source document
is available.</p>
 
<p>The saxon:user-data attribute of saxon:output is removed. Instead, any number of
user-defined attributes may be defined on both xsl:output and xsl:document. These 
attributes must have names in a non-null namespace, which must not be either the XSLT
or the Saxon namespace. These attributes are interpreted as attribute value templates.
The value of the attribute is inserted into the Properties object made available to 
the Emitter handling the output; they will be ignored by the standard output methods,
but can supply arbitrary information to a user-defined output method. The name of the
property will be the expanded name of the attribute in JAXP format, for example
"{http://my-namespace/uri}local-name", and the value will be the value as given,
after evaluation as an attribute value template.</p>
 
<p>The special provisions in XSLT 1.1 for defining what happens when you use xsl:document
 while the current output destination is a temporary tree are not yet implemented.</p>

<h3>URI handling</h3>

<p>The standard URI resolver now accepts URIs containing a fragment identifier. The
fragment identifier must be the value of an ID attribute within the referenced XML
document. The effect is to return a tree containing the subtree rooted at the element
with that id. This facility works for URIs contained in the document() function and
in xsl:include and xsl:import. If there is no element with the required ID, an empty
tree is returned (i.e. a root node with no children).</p>

<p>As a result, embedded stylesheets are now working again. In fact, there is no
special code to handle embedded stylesheets: anywhere a stylesheet module can be
referenced by URI (including the command line, the xml-stylesheet processing
instruction, and the href attribute of xsl:include and xsl:import), a URI containing
a fragment identifier can be used, and this will select the relevant subtree
in the same way as for any other XML document</p>

<p>In response to complaints about Saxon incompatibility with Xalan, and in order to
get the JAXP 1.1 example programs working, I have changed the behaviour of both the
AElfred SAX2 driver, and the SAXON standard URI resolver, so that if no systemId is
specified for a document, then relative URIs are interpreted relative to the user's
current directory. Equally, if the base systemId specified for the document is
a relative URI, this is expanded using the current directory as the base. Arguably
this behaviour is non-compliant with the SAX2 specification,
which states that the systemId must be an absolute URI, but it seems to be a useful
convenience.</p>

<p>This means that every document, and every node, now has a base URI: it can never
be null. A minor side-effect is that I have withdrawn the ability for saxon:node-set()
to take a string (or number, or boolean) as an argument: it must now be a result tree
fragment or an existing node-set. The reason is that there is no obvious way of
constructing a base URI.</p>

<h3>JAXP 1.1</h3>

<p>Saxon 6.1 implements the new TrAX interface, now defined as part of JAXP 1.1: see
<a href="http://java.sun.com/aboutJava/communityprocess/review/jsr063/index.html">JSR-63</a>.
Saxon implements the javax.xml.transform interfaces.  Saxon does not implement (or use)
the javax.xml.parsers interfaces.</p> 

<p>This has involved fairly extensive changes to the Java API for invoking Saxon. Some of the
main implications are:</p>

<ul>
<li><p>Error handling is now via an ErrorListener object which may be user-supplied. The
standard error listener will now report any number of compile-time errors, but will stop
at the first run-time error (XSLT recoverable errors are reported as warnings).</p></li>

<li><p>The package names for classes such as Templates and Transformer have changed.</p></li>

<li><p>The exceptions that are thrown have changed: in general, internal routines now
throw javax.xml.transform.TransformerException or one of its subclasses, where 
previously they threw a SAXException. However, I have removed the exceptions from many
internal methods entirely, where they were not needed. In some cases this is achieved
by throwing an Error instead, which simplifies exception handling in calling routines.</p></li>

<li><p>The Transformer (and hence Saxon's Controller class) is no longer a SAX XMLFilter;
instead it is possible to get an XMLFilter that performs the transformation using the
SAXTransformerFactory class.</p></li>

<li><p>The com.icl.saxon.StyleSheet class no longer acts as the TrAX factory; its only
responsibility now is to implement the command line interface on top of the TrAX Java API.
It now does this almost entirely using TrAX-defined interfaces rather than Saxon internal
interfaces, so the class provides a good demonstration of how the TrAX API can be used.</p></li>

<li><p>The classes OutputDetails and OutputFormat have disappeared; output properties are
now represented throughout the system using a java.util.Properties object as defined in
the TrAX API. Unlike the old OutputDetails class, the Properties object only describes the
format of the required output, not its location. The location is represented by a Result
object.</p></li>

<li><p>The class OutputManager has disappeared: its functions have been merged into the
Outputter class. Code that switches output to a new destination should now call
Controller.changeOutputDestination() to get a new Outputter, and should remember
the previous Outputter so that it can be reinstated when calling 
resetOutputDestination().</p></li>

<li><p>The Emitter class is now an abstract class rather than an interface; this enables null
implementations of many of its methods to be provided. It also enables Emitter to 
implement the TrAX Result interface, which means that wherever the TrAX API allows a Result
object to be supplied defining the destination of a transformation, Saxon allows you to supply
an Emitter as the destination. (A side-effect of this is that FragmentValue, which implements
result tree fragments, is no longer an Emitter, as it cannot be both an Emitter and a
SingularNodeSet; instead, it is possible to call FragmentValue.getEmitter() which provides an emitter
front-end for building the tree).</p></li>

<li><p>If a user-specified ContentHandler is used as the output destination, it will now be
notified of requests to disable or re-enable output escaping using special processing
instructions inserted into the event stream (the names of these are defined as constants
in the class javax.xml.transform.Result). Saxon also now uses a processing instruction to
notify the ContentHandler if output has been suppressed because the result tree is not
well-formed; if the ContentHandler is prepared to accept ill-formed output, it can reject
this notification by throwing a SAXException with the message text "continue".</p></li>

<li><p>Setting of configuration parameters (such as supplying a TraceListener or MessageEmitter)
 is now generally done through the setAttribute() method of the TransformerFactory.
The names of the relevant attributes are defined in com.icl.saxon.FeatureKeys. Methods
such as setXMLReader() on the Controller and PreparedStyleSheet classes have therefore
disappeared.</p></li>

<li><p>For the same reasons, the ParserManager.properties file has disappeared.</p></li>
</ul>

<h3>Effect on Java-only applications</h3>

<p>I have tried to minimize the impact of the TrAX changes on Java-only applications,
but inevitably some incompatible changes have crept in. The main ones are:</p>

<ul>
<li>Many methods now throw TransformerException instead of SAXException.</li>
<li>The Builder.build() method now expects a SAXSource rather than a SAX InputSource.
The SAXSource object contains information about both the input source itself, and the
SAX2 parser (XMLReader) used to process it.</li>
<li>The old OutputDetails object is replaced by a Properties object to define the output
properties and a Result object to define the output destination; the methods setOutputDetails()
and resetOutputDetails() are replaced by changeOutputDestination() and resetOutputDestination().</li>
</ul>

<p>In future I want to align the Java-only processing model more closely with TrAX, so 
that the set of processing rules defining the transformation becomes another kind of Templates
object.</p>


<H3>Defects cleared</H3>

<p>The following errors were reported for version 6.0.2, and have been cleared:</p>

<TABLE>
  <TR>
    <TD vAlign=top>6.0.2/001</TD>
    <TD>For the TinyTree tree model, the method getDocumentElement() always returns null.
    </TD></TR>
  <TR>
    <TD vAlign=top>6.0.2/002</TD>
    <TD>A recurrence of 6.0.1/014: the same code was present in three different places,
    and only one of them was corrected.
    </TD></TR>    
  <TR>
    <TD vAlign=top>6.0.2/003</TD>
    <TD>When Saxon input is supplied as a DOM, CDATA section nodes and entity reference
    nodes are ignored: their contents are simply omitted from the input.
    </TD></TR>    
  <TR>
    <TD vAlign=top>6.0.2/004</TD>
    <TD>A null pointer exception is reported if the stylesheet contains a template rule
    whose match pattern is of the form id('abc'), and the source document contains no
    node with identifier "abc".</td>
    </TD></TR>    
  <TR>
    <TD vAlign=top>6.0.2/005</TD>
    <TD>The method com.icl.saxon.tree.AttributeCollection#getLocalName returns the QName
    of the attribute, not the local part of the name. This causes the local-name() function
    when applied to a namespace-qualified attribute node to return the wrong result.</td>
    </TD></TR>
  <TR>    
    <TD vAlign=top>6.0.2/006</TD>
    <TD>An attempt to access the last comment in the source document using xsl:value-of,
    xsl:copy, etc, will fail if the data part of the processing instruction is zero length. The
    failure occurs with the Microsoft JVM but not with JDK 1.3. Fails with the tinytree
    model only. (Present since 6.0; see also 6.0.1/008)
    </TD></TR>
</TABLE>

<H2>Changes in version 6.0.2 (2000-12-08)</h2>

<H3>Defects cleared</H3>

<p>The following errors were reported for version 6.0.1, and have been cleared
except where otherwise noted:</p>

<TABLE>
  <TR>
    <TD vAlign=top>6.0.1/001</TD>
    <TD>When a template is called recursively to obtain a default value for one
    of its own parameters (i.e. within &lt;xsl:param&gt;), the wrong result may
    be returned. This is because tail recursion is invoked when it should not be.
    (Bug also present in 5.5 and earlier releases).
    </TD></TR>
    
    <TD vAlign=top>6.0.1/002</TD>
    <TD>An array bound exception will occur when processing a document with a stylesheet
    that uses more than 100 namespace URIs or namespace prefixes. Present since 6.0</TD></TR>

    <TD vAlign=top>6.0.1/003</TD>
    <TD>When a key is defined with match="@*", nothing will be retrieved. The problem
    also applies to some other patterns that can match attributes, for example 
    match=" name | @name ".
    (Possibly present in 5.5 and earlier releases - unconfirmed)</TD></TR>

    <TD vAlign=top>6.0.1/004</TD>
    <TD>The extension functions saxon:set-user-data() and get-user-data() do not 
    work correctly with the TinyTree model. They may also fail with the standard tree
    model if the context node is an attribute or namespace. This is because the code relies
    on a one-to-one mapping of XPath nodes to Java objects. (Present since 6.0)
    </TD></TR>
    
    <TD vAlign=top>6.0.1/005</TD>
    <TD>Not a bug.
    </TD></TR>

    <TD vAlign=top>6.0.1/006</TD>
    <TD>When attribute value templates are used in the attributes of xsl:sort, for
    example ascending="{$asc}", then the values used are those that apply the first time
    the sort occurs; if subsequent sorts have different values for the parameters, these
    are ignored. This is true even if the subsequent sort takes place in a later
    transformation using the same PreparedStyleSheet.
    (Also applies to 5.5 and earlier releases).
    </TD></TR>

    <TD vAlign=top>6.0.1/007</TD>
    <TD>saxon:output and other Saxon extension elements do not allow the xsl:extension-element-prefixes
    attribute to appear on the extension element itself. (Present since 6.0)
    </TD></TR>

    <TD vAlign=top>6.0.1/008</TD>
    <TD>An attempt to access the last processing instruction in the source document using xsl:value-of,
    xsl:copy, etc, will fail if the data part of the processing instruction is zero length. The
    failure occurs with the Microsoft JVM but not with JDK 1.3. (Present since 6.0)
    </TD></TR>

    <TD vAlign=top>6.0.1/009 </TD>
    <TD>Running a transformation using the Transformer.getInputContentHandler() method fails
    saying that the same NamePool must be used for the StyleSheet and the source document.
    (Present since 6.0)
    </TD></TR>

    <TD vAlign=top>6.0.1/010 </TD>
    <TD>The code that searches for an xml-stylesheet processing instruction displays unintended
    trace information on System.err.
    </TD></TR>
    
    <TD vAlign=top>6.0.1/011</TD>
    <TD>When xsl:apply-imports is called and there is no explicit imported template rule
    to invoke, Saxon does a no-op; the correct action is to invoke the built-in template
    rule for the current node. (Bug present in all previous releases).
    </TD></TR>

    <TD vAlign=top>6.0.1/012</TD>
    <TD>If the value attribute to xsl:number is not an integer, Saxon truncates it towards
    zero rather than rounding it as specified. (Bug present in all previous releases). 
    </TD></TR>

    <TD vAlign=top>6.0.1/013</TD>
    <TD>With the TinyTree model, selecting a namespace node using //e/namespace::n doesn't
    work. Selecting all namespace nodes using namespace::* is OK. (Present since 6.0)
    </TD></TR>
    
    <TD vAlign=top>6.0.1/014</TD>
    <TD>An array bound check failure may occur in routine 
    com.icl.saxon.tinytree.TinyElementImpl.makeAttributeNodeFS() when searching for
    the last attribute node in the document. (Present since 6.0)
    </TD></TR>    
</TABLE>

<p>Integration with FOP has been restored. Saxon now works with FOP version 0_15_0.</p>

<p>NamePools: I have changed the approach, so that instead of making a copy of the stylesheet
name pool for each transformation, the name pool is now shared (which means its updating methods
are now synchronized, to ensure thread-safety). This shouldn't affect most users, unless you
are manipulating NamePools explicitly. It is still possible to have multiple name pools, but
you now need to organise any copying yourself if this is what you want to do. For 99% of users,
it should be possible to ignore NamePools entirely and just leave the system to use the single
default name pool all the time.</p>

<p>The following changes are for conformance with the (imminent) XSLT 1.0 errata:</p>

<ul>
<li>Copying a namespace node using xsl:copy or xsl:copy-of now works as specified.</li>

<li>When xsl:number level="any" finds no nodes that match the count pattern, the generated
sequence number is now an empty list rather than the number zero.</li>

<li>When the second argument to document() is an empty node-set, this is now signalled as an
error. Previously it was handled as if the second argument was omitted.</li>

<li>It is now an error to use the key() function within the match or use attributes of
xsl:key. Previously this was only an error if the reference was circular, and if the key
was actually referenced within the stylesheet.</li>

<li>When xsl:number is called using the value attribute, the behavior for negative,
    infinite, and NaN values is now as specified.</li>
    
<li>In a numeric sort, NaN is now sorted before all other values. Previously it was sorted
last.</li>

</ul>

<H2>Changes in version 6.0.1 (2000-11-28)</h2>

<H3>Defects cleared</H3>

<p>The following errors were reported for version 6.0, and have been cleared
except where otherwise noted:</p>

<TABLE>
  <TR>
    <TD vAlign=top>6.0/001</TD>
    <TD>When xsl:copy-of is used to copy attributes with no namespace prefix, and the
    owning element has a default namespace declaration (xmlns="xyz"), then an
    invalid prefix is generated for the attributes.</TD></TR>
    
    <TD vAlign=top>6.0/002</TD>
    <TD>The PreparedStyleSheet object is not serially reusable. A new NamePool
    needs to be allocated each time it is used.</TD></TR>

    <TD vAlign=top>6.0/003</TD>
    <TD>A performance bug: in the match pattern row[id=1234] the predicate is not
    recognized as a boolean predicate, therefore the pattern matching code determines
    the position of the row relative to its siblings on the assumption that it needs
    this information. If there are a large number of &lt;row&gt; siblings this gives
    a severe performance hit.</TD></TR>

    <TD vAlign=top>6.0/004</TD>
    <TD>The function-available() function returns false for a method that exists but
    that requires one or more arguments.</TD></TR>

    <TD vAlign=top>6.0/005</TD>
    <TD>The element-available() function crashes (with a diagnostic print of the name pool
    contents) if the supplied name is one that is not used in the stylesheet and is not
    a known XSL or Saxon instruction.</TD></TR>

    <TD vAlign=top>6.0/006</TD>
    <TD>With the TinyTree tree model, finding the descendants of a node that has neither
    descendants nor following-siblings produces incorrect results.</TD></TR>

    <TD vAlign=top>6.0/007</TD>
    <TD>DTDGenerator won't compile: no name pool is supplied to RuleManager</TD></TR>

    <TD vAlign=top>6.0/008</TD>
    <TD>In the SQL sample application, the last row is not written to database. (This
    reported bug has not yet been investigated)</TD></TR>
        
</TABLE>

<H3>Other changes</H3>

<p>Warning messages (issued typically when a node matches more than one template rule)
are now limited in number: only the first 25 are displayed.</p>
    


<H2>Changes in version 6.0 (2000-11-17)</H2>

<p>In Saxon 5.5, I introduced a change that allows a result-tree-fragment to be implicitly
converted to a node-set. I did this in anticipation of changes in XSLT 1.1, and to allow
interoperability with MSXML3. However, Microsoft have now withdrawn this facility and conform
fully to the XSLT 1.0 rules, so in order to protect Saxon's reputation for 100% conformance,
I have decided to withdraw the facility too. It can still be used, however, if the stylesheet
specifies version="1.1". For more details, see <a href="conformance.html">Conformance</a></p>

<H3>Defects in version 5.5.1</H3>

<p>The following errors are cleared in version 6.0:</p>

<TABLE>
  <TR>
    <TD vAlign=top>5.5.1/001</TD>
    <TD>When xsl:copy-of is used to make a copy of an element node that has no attributes or
    namespace declarations of its own, the namespace nodes inherited from its ancestor elements
    are not copied to the result tree. (Present since 5.5)</TD></TR>
    
    <TD vAlign=top>5.5.1/002</TD>
    <TD>In some Java environments (ServletExec) the current method for dynamic loading of classes fails.
    The fix to this detects this failure and reverts to the simple pre-JDK 1.2 method.</TD></TR>

    <TD vAlign=top>5.5.1/003</TD>
    <TD>When &lt;xsl:namespace-alias&gt; is used, Saxon uses the new (result-prefix) prefix
    and the new URI in the output. A careful reading of the spec suggests that it should
    use the old (stylesheet-prefix) prefix with the new URI. (The term "result-prefix" is thus
    a misnomer).</TD></TR>

    <TD vAlign=top>5.5.1/004</TD>
    <TD>An ArrayIndexOutOfBounds exception occurs if the match pattern "@comment()" (or "@text()"
    or "@processing-instruction()") is used in an xsl:template rule. 
    Such a pattern is meaningless (it will never match any nodes) but entirely legal.</TD></TR>

    <TD vAlign=top>5.5.1/005</TD>
    <TD>Saxon does not report an error if two sibling &lt;xsl:with-param&gt; elements
    specify the same parameter name.</TD></TR>

    <TD vAlign=top>5.5.1/006</TD>
    <TD>Where conflicting &lt;xsl:strip-space&gt; and &lt;xsl:preserve-space&gt; elements occur in the
    stylesheet, Saxon gives greater weight to the priority of the pattern than to its import
    precedence. So &lt;xsl:strip-space elements="ns:item"&gt; in an imported stylesheet will
    incorrectly override &lt;xsl:preserve-space elements="ns:*"&gt; in the importing stylesheet.
    </TD></TR>

    <TD vAlign=top>5.5.1/007</TD>
    <TD>A null pointer exception can occur in the AElfred parser when attempting to access an XML file
    using a URL, if the resource accessed by the URL is found but its encoding is unknown.</TD></TR>

    <TD vAlign=top>5.5.1/008</TD>
    <TD>A null pointer exception can occur when evaluating a variable reference within the arguments
    to an extension function that is called within the predicate of a filter expression.</TD></TR>

    <TD vAlign=top>5.5.1/009</TD>
    <TD>When running in fowards-compatible mode, Saxon incorrectly rejects XSL elements that contain
    an attribute other than those defined in XSLT 1.0.</TD></TR>

    <TD vAlign=top>5.5.1/010</TD>
    <TD>When xsl:copy is applied to an attribute, text node, comment, or processing instruction,
    the content of the xsl:copy element should be ignored. It isn't.</TD></TR>

    <TD vAlign=top>5.5.1/011</TD>
    <TD>When output to a DOM Node is requested in the TrAX API, this is ignored if an output
    method is specified in an xsl:output element of the stylesheet. The output is sent to the
    standard output stream instead. The xsl:output element should be ignored.</TD></TR>

    <TD vAlign=top>5.5.1/012</TD>
    <TD>When a top-level element such as xsl:output is used within a template, it is reported
    as an error. This happens even when processing in forwards-compatible mode (e.g. when
    version="1.1"). In this case fallback processing (xsl:fallback) should be invoked.</TD></TR>

    <TD vAlign=top>5.5.1/013 <p>not yet fixed</p></TD>
    <TD>When the first argument to the document() function is a result tree fragment, Saxon
    takes the Base URI (for resolving the URI if it is relative) as if the argument were a
    string. The intention of the specification, though not clearly stated, is that the Base URI
    should be calculated as if the argument were a node-set. That is, if the argument is $tree
    and $tree is defined by &lt;xsl:variable name="tree"&gt;doc.xml&lt;/xsl:variable&gt;, then
    the Base URI should be that of the xsl:variable element, not that of the element containing
    the call on the document() function.</TD></TR>
    
</TABLE>

<H3>New XSLT facilities at version 6.0</H3>

<p>Added support for two new output encodings on xsl:output: iso-8859-2 and cp1250.</p>

<p>Added two attributes to xsl:output (not yet available in saxon:output):
<ul>
<li>
<b>saxon:omit-meta-declaration="yes" or "no"</b> controls, for HTML output, whether a META tag
is added after the HEAD start tag. The default is to include it, setting this attribute
to "yes" causes it to be omitted, which is useful if you prefer to generate it yourself.</li>
<li>
<b>saxon:character-representation</b> gives the preferred representation for special characters.
For method="xml" the values are "hex" or "decimal" controlling whether character references
should be in decimal or hexadecimal notation: this aplies only to characters outside the
selected encoding. For method="html" two values may be given,
separated by a semicolon. The first gives the representation for non-ASCII characters
that are present in the target character set: the values are "native", "entity",
"decimal", or "hex". The second gives the representation for characters outside the
selected encoding: the same values can be used, except for "native". For example if
encoding="iso-8859-1", then saxon:character-representation="native;hex" causes characters
in the range 0-255 to be written as themselves (except less-than, ampersand, etc which
are always written as entity references, as is non-breaking-space), and causes characters outside this range to be
written as hexadecimal character references. By contrast "entity;decimal" causes
characters in the range 160-255 to be written using HTML-defined symbolic entities,
and characters above 255 to be written in decimal. The default is "entity;decimal".
</li></ul>

<p>Added a new extension function saxon:showNodeSet(). It takes a single argument that is
a node-set, produces a diagnostic print of the node-set on System.err, and returns an
empty string.</p>

<p>Added an extension function saxon:getContext() to get the context object. 
Only really intended for diagnostic use.</p>

<h3>Command line changes</h3>

<p>Added an option to choose the tree implementation (see below): -ds for the standard
tree, as used in previous releases, -dt for the "tinytree" which is new to this release.
The tinytree is the default: it takes up less memory, is faster to build, and generally
appears to perform better in most circumstances.</p>

<p>The -a option on the stylesheet, which causes the source document to be processed using the
stylesheet identified from its xml-stylesheet processing instruction, now uses the same logic
as the getAssociatiedStylesheets() method in the TrAX interface. This means multiple (cascading)
stylesheets are now supported. However, embedded stylesheets (identified by href="#id" in the
xml-stylesheet processing instruction) are not supported at this release.</p>


<h3>Java API changes</h3>

<p>There have been a great many internal changes, but relatively few that impact directly
on the high-level transformation API. In particular, if you only use TrAX interfaces, there
are no changes. Otherwise, the main points to note are:</p>

<ul>
<li>If you use the Builder to build a document tree, there are several changes. Firstly, Builder
itself is now an abstract class, it has concrete classes for the two kinds of tree. Secondly,
the Builder must now be supplied with a NamePool for holding all XML names. All documents used
in a transformation must use the same NamePool. Thirdly, the Builder is no longer a SAX2 
ContentHandler, instead it implements Saxon's own Emitter interface. You can front-end it
with a ContentEmitter if you want to drive it via SAX2 events. Finally, it is no longer
possible to strip whitespace nodes from the completed tree, this has to be done using the
Stripper while the tree is being constructed. This has implications if you want to use the
same tree in memory as input to different transformations controlled by different stylesheets.
</li>

<li>If you have a user-written Emitter to handle output, you will have to change it, as the
interface has changed. In particular, names are now passed as integer references to the NamePool,
see the XMLEmitter for an example of how these names are handled.</li>

<li>If you set up parameters to the transformation using a ParameterSet, this has also changed
to use integer namecode rather than Name objects. The TrAX interface, which adds one parameter
at a time, is unaffected.</li>

<li>If you use extension functions that access the Saxon tree structure as a DOM, you need
to be aware that the representation of namespace nodes has changed. 
Namespace nodes are
no longer presented as attribute nodes in the DOM: in fact they are not presented at
all. This simplifies the model, and is consistent with the DOM specifications.
You can still access namespace nodes, but only by casting the DOM objects to Saxon's
own classes.</p>

<p>This release adds support for pluggable character sets: if you specify xsl:output encoding="class-name",
class-name should be a class that implements com.icl.saxon.output.PluggableCharacterSet.
The class must provide two methods, one that determines whether a given character is 
present in the character set, and one that gives the name of the encoding to be used
by the Java VM for translating Unicode characters into a file with this encoding.</p>

<p>To use free-standing XPath expressions and patterns from a Java application, you now
need to supply a StaticContext object when parsing the expression. This object handles the
resolution of variable names, namespace prefixes, and function names occurring within
the expression. For convenience the StandaloneContext object is provided for this purpose.
This class allows namespace prefixes to be declared so they can be used in an expression.
It also allows external functions to be called (but not functions defined in your XSLT
 stylesheet). It does not allow the expression or pattern to contain references to
 variables.</p>
</ul>

<h3>Internal Changes</h3>

<p>These details should only affect you if you access intimate internal interfaces or use the Saxon
source code.</p>

<p>There are two big changes to the internals of Saxon at this release: a new
implementation of the tree structure, and a new system for handling names.</p>

<h4>The tinytree implementation</h4>

<p>I have introduced an alternative tree implementation (called "tinytree").
 This is designed to
reduce the number of Java objects created: the tree is sliced vertically rather than
horizontally, so instead of having one Java object per node, there is one Java array for
each property of the nodes, with an entry in the array for each node.
The effect is to greatly reduce the Java memory management overheads. 
The existing tree structure remains available,
and is always used for the stylesheet tree. It is also currently always used for
the intermediate result tree created when saxon:output next-in-chain is used.</p>

<p>To select the standard tree structure, use -ds on the command line. To select
the "tinytree" structure, use -dt. The default is -dt. You can also select the tree
structure using a method on the Controller class.</p>

<p>The tinytree is smaller than the standard tree, as the name suggests, and it is
also faster to build. However, it may be slower to navigate. So if you have a small
document that is built once in memory and used repeatedly, the standard tree
implementation is probably better. In other cases, however, the tinytree usually
wins.</p>

<h4>Name pools</h4>

<p>I have made radical changes to the way names are managed. Previously, the NamePool object
contained a pool of names, but its only real purpose was to avoid the memory overhead
of storing each name many times. Now, Saxon takes advantage of the NamePool to avoid
storing references to Name objects on the tree at all: instead it stores a "namecode":
an integer which can be used to identify the name within the NamePool.</p>

<p>A <b>namecode</b> has 4 bits unused, 8 bits representing the prefix, and 20 bits acting as
a pointer to an entry in the namepool containing the local name and namespace URI. Two
names are therefore equal if the namecodes are the same in the bottom 20 bits. The
value in these 20 bits is also referred to as the <b>fingerprint</b> of the name.</p>

<p>All searching for objects by name is now done by comparing fingerprints; no
string comparisons are involved.
Fingerprints are used not only for matching names used in XPath expressions to
refer to the source document, they are also used for all matching of names within
a stylesheet, for example variable names, template names, mode names, key names,
and decimal format names.</p>

<p>The name pool is also used for storing namespace declarations: each prefix/URI pair
is allocated a namespace code, and all manipulation of namespace nodes in the tree is
done using these integer codes.</p>

<p>A consequence of this is that all documents used in a transform must use the same
NamePool. This has some implications on the Java API. With simple use of the API, 
you needn't worry about name pools, they will be taken care of automatically. However,
if you are operating a continuously running service in which both source documents and
stylesheets are cached in memory, you may need to exercise some care to specify the
right NamePool when each document is built.</p>

<p>The model is further complicated by multi-threading. Rather than have synchronization
problems with multiple threads updating the same NamePool, the NamePool used to build the
stylesheet is copied (imported) into the NamePool used to build the source document, before
parsing of the source document starts. When you use the transform() method to parse and 
transform an InputSource, this happens automatically. However, if you want to build the
document yourself, and transform it using transformDocument() (which allows you to run
more than one transformation on the same document), then you must manage the NamePool
merging yourself. The system does include checks that the NamePools for the stylesheet
and source document are compatible, though these are not completely foolproof.</p>

<p>The use of namecodes rather than String names has affected many internal interfaces,
and some of these are interfaces that are also exposed externally. For example, the
ParameterSet object which is used to pass parameters from a calling template to a called
template can also be used to supply global parameters to the Transformer. The parameters
in a parameter set are now identified by an integer fingerprint rather than a string name.
You can get the integer namecode from the NamePool using the getFingerprint() method; 
alternatively use the TrAX method addParameter(), which still takes the name as a
String.</p>

<p>The Emitter interface has also changed to use name codes; if you have written your
own Emitter, the code will have to be modified.</p>

<h4>Other changes</h4>

<p>The classes and interfaces used in Saxon for manipulating collections of attributes
now implement the SAX2 Attributes interface.</b></p>

<p>The standard XPath functions have been extensively revised. The main change, apart
 from tidying up the
code, is that the functions are now responsible for evaluating their own arguments, which
enables some optimisation, especially when the arguments are node-sets: they can now be
evaluated using knowledge of the data type required. For example, the not() function
now stops as soon as the first node in the argument node-set is found.</p>

<p>Some of the little-used methods on the NodeInfo interface have been moved as static
methods to a separate helper class, com.icl.saxon.om.Navigator. This enables the
code of these methods to be independent of the particular tree implementation.</p>


<p>The delayed evaluation of path expressions now works as follows: on the first two
occasions that a path expression is evaluated, it navigates the source tree. On the
third occasion, it saves the resulting node-set in memory. On subsequent uses, the
result is retrieved from memory. This approach is designed
to balance time against memory usage.</p>

<p>The optimisation of "//name" as "/descendant::name" (which is possible when there
are no predicates) wasn't working in 5.5 (or for
a while before that), causing an unnecessary sort. This has been corrected. In addition,
the first time "//name" is used for a particular document, the results are now saved, and
all subsequent uses of "//name" for the same document retrieve the results from memory.
This means that the traditional assumption that "//name" is inefficient may no longer
always be true.</p>

<p>A Sequencer class has been introduced for allocating globally-unique sequence numbers.
There are two such sequences, one for document numbers, and one for node numbers. By
default, two sequencers are created when Saxon is loaded, and remain in use until it
is unloaded. However, it is now possible to reset the sequence numbering if required,
either to prevent running out of numbers in a long-running server, or to ensure repeatability
of the value of generate-id(). The result of generate-id() depends on the document
number, and you can restart the sequence of document numbers by calling 
controller.setDocumentSequencer(new com.icl.saxon.om.Sequencer()). It is the caller's responsibility to
ensure that this does not cause two documents that are in use at the same time 
to have the same number. The node sequence number is used when sorting nodes into
document order, and when eliminating duplicates in a union operation. You can similarly
allocate a new sequence using controller.setNodeSequencer().</p>


<p>Added an optimization for recursive processing of a node-set: the predicate
"[position() > 1]" is now recognized and handled specially, allowing pipelined
execution and reducing memory requirements.</p>

<p>Removed getAttributeValue(Name), replaced it with getAttributeValue(String uri,
String localName). This is more efficient: in many cases it removes the need to
construct the Name object and then take it apart. Attributes can also be found
using the integer fingerprint of the name.</p>

<p>The Name class is no longer used for holding expanded names, it now serves merely
as a container for a couple of static methods for name validation.
</p>

<p>NameTest and its subclasses have been reorganised. There is a new class NodeTest which is a
subclass of Pattern; it performs the test on node-type and node-name supporting a
node-test in XPath. This test is context-free. As well as replacing the NameTest class,
it also replaces NodeTypePattern and NamedNodePattern. The NodeTest is now used on
a Step, and on an Axis, replacing the previous combination of a NameTest and a node type.
These tests are also used in testing which nodes are candidates for whitespace stripping.
</p>

<p>The interface between the Step and Axis classes and the expression parser has been
much simplified.</p>




<p align="center">Michael H. Kay<br>
<a href="http://www.saxonica.com/">Saxonica Limited</a><br>
24 November 2005</p>
</FONT></BODY></HTML>