# Product Packages

Saxon is distributed in two packages: Saxon-B and Saxon-SA. Saxon-B is available under an open-source license and all its features are available to all users. Saxon-SA requires activation by a license key, and it is possible to purchase various subsets of the functionality. These are summarized in the table below.

Feature | Saxon-B | Saxon-SA
| all | SA001 (Full) | SA030 (XSLT) | SA040 (XQuery) | SA050 (Schema)
Basic XSLT | yes | yes | yes | yes | yes
Basic XQuery | yes | yes | yes | yes | yes
Schema-Aware XSLT | no | yes | yes | no | no
Schema-Aware XQuery | no | yes | no | yes | no
Schema Validation | no | yes | yes | yes | yes
Advanced Extension Functions (see Note 1) | no | yes | yes | yes | no
Advanced Optimizer (see Note 2) | no | yes | yes | yes | no
Serial Processing of Large Documents | no | yes | yes | no | no
Binary Document Storage (PTree) | no | yes | yes | yes | no

Note 1: Extension functions in this category include `saxon:try()`, which provides the ability to catch run-time errors; `saxon:function()` which provides higher-order functions; `saxon:analyze-string()` and `saxon:for-each-group()` which provide XQuery users with an equivalent to the `xsl:analyze-string` and `xsl:for-each-group` instructions in XSLT; and `saxon:index()` and `saxon:find()` which provide a "manual" indexing capability for XQuery, similar to the `xsl:key` construct in XSLT.

Note 2: Saxon-B always implements joins using a nested-loop strategy, which takes increasingly long as the documents become larger. Saxon-SA where possible uses a hash-join algorithm. This applies whether the join is expressed as a path expression, an XQuery FLWOR expression, or a nested set of `xsl:for-each` instructions in XSLT. In some of the queries in the XMark benchmark, the effect is to reduce query time on a 10Mb source document from 16 seconds to 45 milliseconds.

For product prices, see the online store.

Next