XSLTools

Annotated README.txt

233:15159e66b39a
2005-09-30 paulb [project @ 2005-09-30 22:53:43 by paulb] Added special "macro" attribute support: simpler attributes for use in templates. Also added experimental stylesheets for schema creation and for the production of generic processing stylesheets.
paulb@104 1
Introduction
paulb@104 2
------------
paulb@76 3
paulb@104 4
XSLTools is a collection of modules and packages facilitating the development
paulb@104 5
of applications based on XML, XSL stylesheets and transformations, notably Web
paulb@104 6
applications involving complicated Web forms potentially consisting of
paulb@104 7
editable hierarchical structures and potentially involving "live" or "in-page"
paulb@104 8
dynamic updates to portions of those Web forms.
paulb@28 9
paulb@109 10
Quick Start
paulb@109 11
-----------
paulb@109 12
paulb@109 13
Try running the demo:
paulb@109 14
paulb@109 15
python tools/demo.py
paulb@109 16
paulb@109 17
An introductory guide to creating applications can be found in the docs
paulb@109 18
directory - see docs/index.html for the start page.
paulb@109 19
paulb@109 20
Contact, Copyright and Licence Information
paulb@109 21
------------------------------------------
paulb@109 22
paulb@109 23
The current Web page for XSLTools at the time of release is:
paulb@109 24
paulb@109 25
http://www.boddie.org.uk/python/XSLTools.html
paulb@109 26
paulb@109 27
Copyright and licence information can be found in the docs directory - see
paulb@194 28
docs/COPYING.txt, docs/LICENCE.txt and docs/LICENCE-Sarissa.txt for more
paulb@194 29
information.
paulb@109 30
paulb@104 31
Dependencies
paulb@104 32
------------
paulb@104 33
paulb@104 34
XSLTools has the following basic dependencies:
paulb@28 35
paulb@104 36
Package                     Release Information
paulb@104 37
-------                     -------------------
paulb@104 38
paulb@207 39
libxml2dom                  0.2.1
paulb@185 40
libxml2                     Tested with 2.6.17
paulb@185 41
libxslt                     Tested with 1.1.12
paulb@28 42
paulb@210 43
The example Web applications require WebStack (release 1.0 or later).
paulb@104 44
paulb@190 45
New in XSLTools 0.2 (Changes since XSLTools 0.1)
paulb@190 46
------------------------------------------------
paulb@190 47
paulb@231 48
  * Made a new XSLTools package and moved XSLOutput into it.
paulb@231 49
  * Added XMLCalendar and XMLTable (to the XSLTools package).
paulb@231 50
  * Changed in-page requests to contain proper POST data.
paulb@231 51
  * Updated the code to work with WebStack 1.0 changes.
paulb@231 52
  * Added a dictionary (or word lookup) example application.
paulb@231 53
  * Added template:if to XSLForms.
paulb@231 54
  * Added element-path and url-encode XSLForms extension functions.
paulb@231 55
  * Improved Unicode support in the XSLForms extension functions.
paulb@231 56
  * Added Debian package support.
paulb@231 57
  * Added missing COPYING.txt file.
paulb@231 58
  * Renamed the scripts to avoid naming issues in system-wide installations.
paulb@190 59
paulb@104 60
Notes on In-Page Update Functionality
paulb@104 61
-------------------------------------
paulb@28 62
paulb@185 63
Special note #1: Konqueror seems in certain cases to remember replaced form
paulb@185 64
content (when replaceChild is used to replace regions of the page which
paulb@185 65
include form elements). This causes the browser to believe that more form
paulb@185 66
fields exist on the page than actually do so, and subsequent form submissions
paulb@185 67
thus include the values of such removed fields. A special hack is in place to
paulb@185 68
disable form fields by changing their names, thus causing Konqueror to not
paulb@185 69
associate such fields with the real, active fields; this hack does not seem to
paulb@185 70
cause problems for Mozilla. This needs some investigation to determine in
paulb@185 71
exactly which circumstances the problem arises.
paulb@185 72
paulb@185 73
Special note #2: Konqueror also seems to crash if asked to find elements using
paulb@185 74
an empty 'id' attribute string. This needs some investigation to see if it
paulb@185 75
really is the getElementById call that causes the crash.
paulb@125 76
paulb@221 77
Special note #3: Konqueror's XMLHttpRequest seems to append null characters to
paulb@221 78
the end of field values. Attempting to prune them before the request is sent
paulb@221 79
fails with a function like the following:
paulb@221 80
paulb@221 81
function fixValue(fieldValue) {
paulb@221 82
    if (fieldValue.length == 0) {
paulb@221 83
        return fieldValue;
paulb@221 84
    } else if (fieldValue[fieldValue.length - 1] == '\0') {
paulb@221 85
        return fieldValue.substr(0, fieldValue.length - 1);
paulb@221 86
    } else {
paulb@221 87
        return fieldValue;
paulb@221 88
    }
paulb@221 89
}
paulb@221 90
paulb@221 91
This may be because it is the entire message that is terminated with the null
paulb@221 92
character, and that this happens only upon sending the message. Consequently,
paulb@221 93
some frameworks (notably mod_python) do not support in-page functionality when
paulb@221 94
used from Konqueror.
paulb@207 95
paulb@104 96
Various browsers (eg. Mozilla/Firefox, Konqueror) will not allow the
paulb@185 97
XMLHttpRequest in-page updates to function unless the URL used in the
paulb@185 98
requestUpdate JavaScript function is compatible with the URL at which the
paulb@185 99
browser finds the application. Currently, relative URLs are in use to avoid
paulb@185 100
this issue of compatibility, but should an absolute URL be deduced using the
paulb@185 101
WebStack API and then used, it may be possible that the values returned by
paulb@185 102
that API do not match the actual addresses entered into the address bar of the
paulb@185 103
browser.
paulb@28 104
paulb@104 105
To check the behaviour of the applications, it is possible to view the
paulb@104 106
document source of the pages served by applications and to verify that the
paulb@185 107
URLs mentioned in the JavaScript function calls (to 'requestUpdate') either be
paulb@185 108
a relative link or involve a URL similar to that which appears in the
paulb@185 109
browser's address bar. In some environments, the use of 'localhost' addresses
paulb@185 110
often confuses the browser and server; one workaround is to use real host
paulb@185 111
names or addresses instead of 'localhost'.
paulb@155 112
paulb@166 113
Choosing an element-path:
paulb@166 114
paulb@166 115
When specifying the "context" of the in-page update, one must imagine which
paulb@166 116
element the template fragment should operate within. If the template:id
paulb@166 117
attribute marks a particular section, then the element-path should be a path
paulb@166 118
to the applicable context element for that section in the complete template
paulb@166 119
document. Note that if a template:element attribute appears on the same
paulb@166 120
element as the template:id attribute then the element-path should refer to the
paulb@166 121
element specified in the template:element attribute.
paulb@166 122
paulb@166 123
Choosing where to put template:attribute, template:id and id:
paulb@166 124
paulb@166 125
When specifying the extent of a template fragment, one must be sure not to put
paulb@166 126
the template:id attribute on the same element as a template:attribute
paulb@166 127
annotation; otherwise, the generated code will be improperly extracted as a
paulb@166 128
fragment producing two versions of the element - one for when the specified
paulb@166 129
attribute is present, and one for when it is not present. Generally,
paulb@166 130
template:id and id can be placed on the same node, however.
paulb@173 131
paulb@173 132
Stable element ordering and element-path:
paulb@173 133
paulb@173 134
Within the element-path, the numbering of the elements will start at 1.
paulb@173 135
Therefore it is vital to choose a region of the form data structure with the
paulb@173 136
element-path which is isolated from surrounding elements whose positions would
paulb@173 137
otherwise be dependent on a stable ordering of elements, and whose processing
paulb@173 138
would be disrupted if some new elements suddenly appeared claiming the same
paulb@173 139
positions in the document. For example:
paulb@173 140
paulb@173 141
  <item value="">         .../item$1/value
paulb@173 142
    <type value=""/>      .../item$1/type$1/value
paulb@173 143
    <comment value=""/>   .../item$1/comment$2/value
paulb@173 144
  </item>
paulb@173 145
paulb@173 146
  In-page update...
paulb@173 147
paulb@173 148
  <comment value=""/>     .../item$1/comment$1/value
paulb@173 149
paulb@173 150
Notes on XSL
paulb@173 151
------------
paulb@173 152
paulb@173 153
libxslt seems to be quite liberal on the definition of runtime parameters, in
paulb@173 154
that there is no apparent need to explicitly declare the corresponding global
paulb@173 155
variables in stylesheets. Whilst this is nice, we may eventually need to
paulb@173 156
detect such variables and add them in the preparation process.
paulb@184 157
paulb@184 158
Release Procedures
paulb@184 159
------------------
paulb@184 160
paulb@201 161
Update the XSLTools/__init__.py and XSLForms/__init__.py __version__
paulb@201 162
attributes.
paulb@184 163
Change the version number and package filename/directory in the documentation.
paulb@184 164
Change code examples in the documentation if appropriate.
paulb@184 165
Update the release notes (see above).
paulb@184 166
Check the setup.py file and ensure that all package directories are mentioned.
paulb@207 167
Check the release information in the PKG-INFO file and in the package
paulb@207 168
changelog (and other files).
paulb@184 169
Tag, export.
paulb@184 170
Generate the API documentation.
paulb@184 171
Remove generated .pyc files: rm `find . -name "*.pyc"`
paulb@184 172
Archive, upload.
paulb@184 173
Upload the introductory documentation.
paulb@184 174
Update PyPI, PythonInfo Wiki, Vaults of Parnassus entries.
paulb@184 175
paulb@184 176
Generating the API Documentation
paulb@184 177
--------------------------------
paulb@184 178
paulb@184 179
In order to prepare the API documentation, it is necessary to generate some
paulb@184 180
Web pages from the Python source code. For this, the epydoc application must
paulb@231 181
be available on your system. Then, inside the distribution directory, run the
paulb@184 182
apidocs.sh tool script as follows:
paulb@184 183
paulb@184 184
./tools/apidocs.sh
paulb@184 185
paulb@184 186
Some warnings may be generated by the script, but the result should be a new
paulb@231 187
apidocs directory within the distribution directory.
paulb@218 188
paulb@218 189
Making Packages
paulb@218 190
---------------
paulb@218 191
paulb@218 192
To make Debian packages:
paulb@218 193
paulb@230 194
  1. Create new package directories under packages/debian if necessary.
paulb@230 195
  2. Make a symbolic link in the distribution's root directory to keep the
paulb@230 196
     Debian tools happy:
paulb@218 197
paulb@230 198
     ln -s packages/debian/python2.4-xsltools/debian/
paulb@218 199
paulb@230 200
  3. Run the package builder:
paulb@218 201
paulb@230 202
     dpkg-buildpackage -rfakeroot
paulb@218 203
paulb@230 204
  4. Locate and tidy up the packages in the parent directory of the
paulb@230 205
     distribution's root directory.