# HG changeset patch # User Paul Boddie # Date 1266969577 -3600 # Node ID 0550b4fc2f5c92a2b402730f11a0e6b96fffdd1b # Parent fd003deb4d5942b0c31a82b7d6ec6fd501bcb941 Added template:sort which controls the ordering of presented elements. Updated the example in order to demonstrate multiple-choice ordering using the translated choice labels. Updated various copyright headers. diff -r fd003deb4d59 -r 0550b4fc2f5c README.txt --- a/README.txt Sun Nov 29 02:01:41 2009 +0100 +++ b/README.txt Wed Feb 24 00:59:37 2010 +0100 @@ -85,6 +85,8 @@ parameters which are outside the form document structure. * Added special attributes indicating the presence of file uploads, using a special file namespace in form documents. + * Added a template:sort annotation in order to control the ordering of + presented elements. New in XSLTools 0.5 (Changes since XSLTools 0.4.6) -------------------------------------------------- diff -r fd003deb4d59 -r 0550b4fc2f5c XSLForms/XSL/Prepare.xsl --- a/XSLForms/XSL/Prepare.xsl Sun Nov 29 02:01:41 2009 +0100 +++ b/XSLForms/XSL/Prepare.xsl Wed Feb 24 00:59:37 2010 +0100 @@ -4,7 +4,7 @@ stylesheet - something which is capable of transforming XML documents into Web pages or other kinds of XML documents. -Copyright (C) 2005, 2006, 2007, 2008 Paul Boddie +Copyright (C) 2005, 2006, 2007, 2008, 2010 Paul Boddie This program is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free @@ -105,11 +105,15 @@ - + + + - + + + @@ -127,7 +131,9 @@ - + + + @@ -145,6 +151,12 @@ + + + + + + @@ -335,7 +347,7 @@ - + diff -r fd003deb4d59 -r 0550b4fc2f5c XSLForms/XSL/PrepareMacro.xsl --- a/XSLForms/XSL/PrepareMacro.xsl Sun Nov 29 02:01:41 2009 +0100 +++ b/XSLForms/XSL/PrepareMacro.xsl Wed Feb 24 00:59:37 2010 +0100 @@ -4,7 +4,7 @@ lower-level attributes that can be translated into the final output stylesheet code. -Copyright (C) 2005 Paul Boddie +Copyright (C) 2005, 2007, 2010 Paul Boddie This program is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free diff -r fd003deb4d59 -r 0550b4fc2f5c docs/labels.html --- a/docs/labels.html Sun Nov 29 02:01:41 2009 +0100 +++ b/docs/labels.html Wed Feb 24 00:59:37 2010 +0100 @@ -6,44 +6,215 @@

Creating Applications: Labelling Multiple-Choice Values

-

When introducing the item type multiple-choice field into the application, we defined the following values:

<?xml version="1.0"?>
<type>
<type-enum value="(Not selected)"/>
<type-enum value="Important"/>
<type-enum value="Not important"/>
<type-enum value="Personal"/>
</type>

For -simple applications with a limited audience, it is often acceptable to -use values which are then presented unchanged such that the value Personal is known both inside the application and is also shown to the user as the textual string Personal. However, for other applications there may be good reasons not to show values directly in this way:

  1. There may be a special internal value which is not descriptive; for example 123 representing the same concept as Personal.
  2. The value might be understandable not be understandable to some users; for example, the text Personal may not be understood by users who do not speak or otherwise use the English language.

We -must therefore consider introducing additional label information in -order to remedy the first case, at least. Consequently, we may modify -the defined values as follows:

?xml version="1.0"?>
<type>
<type-enum value="0">(Not selected)</type-enum>
<type-enum value="I">Important</type-enum>
<type-enum value="N">Not important</type-enum>
<type-enum value="P">Personal</type-enum>
</type>

Here, -we have provided user-visible labels which can now be used by the -template. A single change to the item type choices list is required to -include these labels as the visible text in that particular form -control whilst maintaining the usage of the internal values:

  <p>
Item type:
<select template:multiple-choice-list-field="type,type-enum,value" name="..." multiple="multiple"
onchange="requestUpdate(
'comments',
'{template:list-attribute('type-enum', 'value')}',
'{template:other-elements(../options)}',
'{template:child-attribute('value', template:child-element('comment', 1, template:other-elements(../options)))}',
'/structure/item/options')">
<option template:multiple-choice-list-value="type-enum,value,selected,text()" value="..." />
</select>
</p>

The addition, as described in the template:multiple-choice-value and template:multiple-choice-list-value sections of the "Template Attribute Reference" document, selects the text inside the appropriate type-enum elements and inserts it as a label into each choice in the item type list.

    -

Updating the Web Resource

+ +

When introducing the item type multiple-choice field into the application, we defined the following values:

+ +
+<?xml version="1.0"?>
+<type>
+  <type-enum value="(Not selected)"/>
+  <type-enum value="Important"/>
+  <type-enum value="Not important"/>
+  <type-enum value="Personal"/>
+</type>
+
+ +

For simple applications with a limited audience, it is often acceptable to +use values which are then presented unchanged such that the value +Personal is known both inside the application and is also shown to +the user as the textual string Personal. However, for other +applications there may be good reasons not to show values directly in this +way:

+ +
    +
  1. There may be a special internal value which is not descriptive; for example + 123 representing the same concept as Personal.
  2. +
  3. The value might be understandable not be understandable to some users; for + example, the text Personal may not be understood by users who do + not speak or otherwise use the English language.
  4. +
+ +

We must therefore consider introducing additional label information in order +to remedy the first case, at least. Consequently, we may modify the defined +values as follows:

+ +
?xml version="1.0"?>
+<type>
+  <type-enum value="0">(Not selected)</type-enum>
+  <type-enum value="I">Important</type-enum>
+  <type-enum value="N">Not important</type-enum>
+  <type-enum value="P">Personal</type-enum>
+</type>
+ +

Here, we have provided user-visible labels which can now be used by the +template. A single change to the item type choices list is required to include +these labels as the visible text in that particular form control whilst +maintaining the usage of the internal values:

+ +
+  <p>
+    Item type:
+    <select template:multiple-choice-list-field="type,type-enum,value" name="..." multiple="multiple"
+      onchange="requestUpdate(
+        'comments',
+        '{template:list-attribute('type-enum', 'value')}',
+        '{template:other-elements(../options)}',
+        '{template:child-attribute('value', template:child-element('comment', 1, template:other-elements(../options)))}',
+        '/structure/item/options')">
+      <option template:multiple-choice-list-value="type-enum,value,selected,text()" value="..." />
+    </select>
+  </p>
+
+ +

The addition, as described in the template:multiple-choice-value +and template:multiple-choice-list-value +sections of the "Template Attribute Reference" +document, selects the text inside the appropriate type-enum +elements and inserts it as a label into each choice in the item type list.

+ +

Updating the Web Resource

+

To update the special WebStack resource, we now need to modify a few of the class attributes:

-
    template_resources = {
"structure" : ("structure_multivalue_label_template.xhtml", "structure_output.xsl")
}
init_resources = {
"structure" : ("structure_multivalue_label_template.xhtml", "structure_input.xsl")
}
document_resources = {
"types" : "structure_types_label.xml"
}
-

With these adjustments, it should now be possible to see the -original labels and yet have the application manipulate a separate set -of internal values. -Note that it may be necessary to remove the old stylesheet for -producing output, structure_output.xsl, so that the updated version of the template is taken into use.

Translating Labels

Whilst -the above work made it possible to satisfy the first motivation of the -use of labels - to hide internal values - it did not permit us to -provide translations for different languages. In fact, there are at -least two approaches which could provide labels in multiple languages:

  1. Define a file containing the types and type-enum elements for each language.
  2. Use the internationalisation support in XSLForms to translate the labels.

The -former approach might work in situations where multiple-choice values -are obtained from a repository, such as a database, which contains the -labels for items in each supported language. One can envisage a product -database, for example, containing product descriptions for each -language or market, and such information could be extracted in such a -way that it could be convenient to use many different data files (or to -extract the information dynamically, insert it into the form data -document, and to provide a reference to the form data document as a -source of value information).

Let us concentrate, however, on the -latter, more convenient approach for our example application. In order -to produce translated labels, we must first define a translations file as described in the "Internationalisation" document; this file can be saved alongside our other resources with the name translations.xml, and its contents can be defined as follows:

<?xml version="1.0" encoding="iso-8859-1"?>
<translations>
<locale>
<code value="nb"/>
<code value="nb_NO"/>
<translation value="(Not selected)">(Ikke valgt)</translation>
<translation value="Important">Viktig</translation>
<translation value="Not important">Ikke viktig</translation>
<translation value="Personal">Personlig</translation>
</locale>
</translations>

To make use of this file, we must add additional references in the Web resource's attributes:

    document_resources = {
"types" : "structure_types_label.xml",
"translations" : "translations.xml"
}

And to introduce the translation mechanisms into the output production, we must modify the resource further:

        # Complete the response.

stylesheet_parameters["locale"] = trans.get_content_languages()[0]
self.send_output(trans, [trans_xsl], structure, stylesheet_parameters,
references={"translations" : self.prepare_document("translations")})

Here, we define a locale -parameter for the output stylesheet using the first language specified -in each user's browser's language preferences. Then, we add a reference -to the translations document specified above.

Finally, we have to change the template to make use of the translations:

  <p>
Item type:
<select name="..." template:multiple-choice-list-field="type,type-enum,value" multiple="multiple">
<option template:multiple-choice-list-value="type-enum,value,selected,template:i18n(text())" value="..." />
</select>
</p>

Note that we use the template:i18n extension function to modify the text found in each type-enum element in the types document. The usage of this function is described in the extension function API documentation.

Now, upon adding items in the application, if the browser is set up appropriately - in this case using Norwegian Bokmål [nb] as the first choice of language - the item types will appear translated in the final output.

+ +
+    template_resources = {
+        "structure" : ("structure_multivalue_label_template.xhtml", "structure_output.xsl")
+        }
+    init_resources = {
+        "structure" : ("structure_multivalue_label_template.xhtml", "structure_input.xsl")
+        }
+    document_resources = {
+        "types" : "structure_types_label.xml"
+        }
+
+ +

With these adjustments, it should now be possible to see the original labels +and yet have the application manipulate a separate set of internal values. +Note that it may be necessary to remove the old stylesheet for producing +output, structure_output.xsl, so that the updated version of the +template is taken into use.

+ +

Translating Labels

+ +

Whilst the above work made it possible to satisfy the first motivation of +the use of labels - to hide internal values - it did not permit us to provide +translations for different languages. In fact, there are at least two +approaches which could provide labels in multiple languages:

+ +
    +
  1. Define a file containing the types and type-enum + elements for each language.
  2. +
  3. Use the internationalisation support in XSLForms to translate the + labels.
  4. +
+ +

The former approach might work in situations where multiple-choice values +are obtained from a repository, such as a database, which contains the labels +for items in each supported language. One can envisage a product database, for +example, containing product descriptions for each language or market, and such +information could be extracted in such a way that it could be convenient to use +many different data files (or to extract the information dynamically, insert it +into the form data document, and to provide a reference to the form data +document as a source of value information).

+ +

Let us concentrate, however, on the latter, more convenient approach for our +example application. In order to produce translated labels, we must first +define a translations file +as described in the "Internationalisation" +document; this file can be saved alongside our other resources with the name +translations.xml, and its contents can be defined as follows:

+ +
+<?xml version="1.0" encoding="iso-8859-1"?>
+<translations>
+  <locale>
+    <code value="nb"/>
+    <code value="nb_NO"/>
+    <translation value="(Not selected)">(Ikke valgt)</translation>
+    <translation value="Important">Viktig</translation>
+    <translation value="Not important">Ikke viktig</translation>
+    <translation value="Personal">Personlig</translation>
+  </locale>
+</translations>
+ +

To make use of this file, we must add additional references in the Web +resource's attributes:

+ +
+    document_resources = {
+        "types" : "structure_types_label.xml",
+        "translations" : "translations.xml"
+        }
+
+ +

And to introduce the translation mechanisms into the output production, we +must modify the resource further:

+ +
+        # Complete the response.
+
+        stylesheet_parameters["locale"] = trans.get_content_languages()[0]
+        self.send_output(trans, [trans_xsl], structure, stylesheet_parameters,
+            references={"translations" : self.prepare_document("translations")})
+
+ +

Here, we define a locale parameter for the output stylesheet +using the first language specified in each user's browser's language +preferences. Then, we add a reference to the translations document specified +above.

+ +

Finally, we have to change the template to make use of the translations:

+ +
+  <p>
+    Item type:
+    <select name="..." template:multiple-choice-list-field="type,type-enum,value" multiple="multiple">
+      <option template:multiple-choice-list-value="type-enum,value,selected,template:i18n(text())" value="..." />
+    </select>
+  </p>
+
+ +

Note that we use the template:i18n +extension function to modify the text found in each type-enum +element in the types document. The usage of this function is described in the +extension function API +documentation.

Now, upon adding items in the application, if the +browser is set up appropriately - in this case using Norwegian +Bokmål [nb] as the first choice of language - the item types will +appear translated in the final output.

+ +

Sorting Choices

+ +

Despite offering translations of labels, our work may not be complete. For +long lists of values, it may be desirable to sort the choices in an order that +is meaningful to the user, and it might not be possible to rely on a suitable +ordering of values from the source which provides them. Consider a list of +countries where the underlying multiple-choice value is a two letter country +code. If such a list were presented sorted by the country codes, yet were to +employ labels which gave the translated names of the countries, the ordering +would seem almost arbitrary and difficult to navigate for the user.

+ +

To resolve such matters, we have to introduce an additional annotation in +order to control the ordering of choices:

+ +
+  <p>
+    Item type:
+    <select name="..." template:multiple-choice-list-field="type,type-enum,value" multiple="multiple">
+      <option template:multiple-choice-list-value="type-enum,value,selected,template:i18n(text())" template:sort="template:i18n(text())" value="..." />
+    </select>
+  </p>
+
+ +

By requesting that the choices be sorted according to the translated label, +they should have an ordering that the user can relate to and navigate more +easily.

+

Further Reading

+

Now that we have designed and implemented a simple application, it may be worth reading some recommendations about developing your own applications.

diff -r fd003deb4d59 -r 0550b4fc2f5c docs/multivalue.html --- a/docs/multivalue.html Sun Nov 29 02:01:41 2009 +0100 +++ b/docs/multivalue.html Wed Feb 24 00:59:37 2010 +0100 @@ -6,6 +6,7 @@

Creating Applications: Adding Multivalued Fields

+

Although some applications only require multiple-choice fields where only a single value may be chosen, in many situations it is desirable to be able to choose an arbitrary number of values for a particular @@ -13,80 +14,189 @@ represent form data using a single attribute on a single element to represent any given field value. With multivalued fields, we must choose a different strategy in using XML to represent such information.

+

Let us consider permitting multiple type values to be associated with our items. We revise our form data structure -to -be the following:

-
<?xml version="1.0"?>
<structure>
<item value="some value">
<type>
<type-enum value="some type"/>
<type-enum value="some other type"/>
</type>
<subitem subvalue="some other value"/>
</item>
</structure>
+to be the following:

+ +
<?xml version="1.0"?>
+<structure>
+  <item value="some value">
+    <type>
+      <type-enum value="some type"/>
+      <type-enum value="some other type"/>
+    </type>
+    <subitem subvalue="some other value"/>
+  </item>
+</structure>
+

Multivalued Fields

+

We shall now take advantage of those HTML form fields which permit -users to select one -or many values presented in a list or menu.

+users to select one or many values presented in a list or menu.

Some item:

Item type: - +

Itself containing more items:

Sub-item:

-From the item type list many value may now be selected. +

From the item type list many values may now be selected.

+

Taking the example HTML code from before, we can add a definition of this new list to the template to produce something like this:

-
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:template="http://www.boddie.org.uk/ns/xmltools/template">
<head>
<title>Example</title>
</head>
<body template:element="structure">
<form action="" method="post">

<!-- Template text between the start and the interesting part. -->

<div template:element="item">
<p>
Some item: <input template:attribute-field="value" name="..." type="text" value="..." />
<input name="..." template:selector-field="remove" type="submit" value="Remove" />
</p>
<p>
Item type:
<select name="..." template:multiple-choice-list-field="type,type-enum,value" multiple="multiple">
<option template:multiple-choice-list-value="type-enum,value,selected" value="..." />
</select>
</p>
<p>
Itself containing more items:
</p>
<p template:element="subitem">
Sub-item: <input template:attribute-field="subvalue" name="..." type="text" value="..." />
<input name="..." template:selector-field="remove2" type="submit" value="Remove" />
</p>
<p>
<input name="..." template:selector-field="add2,subitem" type="submit" value="Add subitem" />
</p>
</div>
<p>
<input name="..." template:selector-field="add,item" type="submit" value="Add item" />
</p>

<!-- Template text between the interesting part and the end. -->

</form>
</body>
</html>
+ +
<html xmlns="http://www.w3.org/1999/xhtml"
+      xmlns:template="http://www.boddie.org.uk/ns/xmltools/template">
+<head>
+  <title>Example</title>
+</head>
+<body template:element="structure">
+<form action="" method="post">
+
+<!-- Template text between the start and the interesting part. -->
+
+<div template:element="item">
+  <p>
+    Some item: <input template:attribute-field="value" name="..." type="text" value="..." />
+    <input name="..." template:selector-field="remove" type="submit" value="Remove" />
+  </p>
+  <p>
+    Item type:
+    <select name="..." template:multiple-choice-list-field="type,type-enum,value" multiple="multiple">
+      <option template:multiple-choice-list-value="type-enum,value,selected" value="..." />
+    </select>
+  </p>
+  <p>
+    Itself containing more items:
+  </p>
+  <p template:element="subitem">
+    Sub-item: <input template:attribute-field="subvalue" name="..." type="text" value="..." />
+    <input name="..." template:selector-field="remove2" type="submit" value="Remove" />
+  </p>
+  <p>
+    <input name="..." template:selector-field="add2,subitem" type="submit" value="Add subitem" />
+  </p>
+</div>
+<p>
+  <input name="..." template:selector-field="add,item" type="submit" value="Add item" />
+</p>
+
+<!-- Template text between the interesting part and the end. -->
+
+</form>
+</body>
+</html>
+

From the previous single-valued case, some crucial changes have been made:

+
  1. The select element remains mapped onto the type -element in the form data structure. However, we use a different attribute, template:multiple-choice-list-field, to indicate that a type -element is created when the form data is submitted, but instead of a single value being added to the value attribute of that one element, a separate type-enum -element is created within the type -element with a value in its value attribute for each value submitted. This means that many type-enum -elements may be created within the type -element, and each one of them will have a different value attribute.
  2. + element in the form data structure. However, we use a different attribute, + template:multiple-choice-list-field, to indicate that a + type element is created when the form data is submitted, but + instead of a single value being added to the value attribute of + that one element, a separate type-enum element is created within + the type element with a value in its value attribute + for each value submitted. This means + that many type-enum elements may be created within the + type element, and each one of them will have a different + value attribute.
  3. Of course, the select element now has a multiple -attribute defined to permit multiple value selections.
  4. + attribute defined to permit multiple value selections.
  5. Inside the select element, the option -element now employs the template:multiple-choice-list-value annotation.
  6. + element now employs the template:multiple-choice-list-value annotation.
+

Output Structures

+

Unlike in the single-valued case, the revised the form data structure for input is almost the same as the structure used by the template. Indeed, the subtle differences cannot be represented in our simplistic presentation of the structure:

-
<?xml version="1.0"?>
<structure>
<item value="some value">
<type>
<type-enum value="some type"/>
<type-enum value="some other type"/>
</type>
<subitem subvalue="some other value"/>
</item>
</structure>
+ +
<?xml version="1.0"?>
+<structure>
+  <item value="some value">
+    <type>
+      <type-enum value="some type"/>
+      <type-enum value="some other type"/>
+    </type>
+    <subitem subvalue="some other value"/>
+  </item>
+</structure>
+

In fact, the principal difference arises through the number of type-enum elements that occur in the input, representing the values selected by the user, and the number that occur in the output, representing the complete range of values available for selection.

+

Presenting the Extra Values

+

In most respects, the presentation of the extra values is the same as in the single-valued case. The result of the presentation of the extra values is that the type element in the this example structure fragment...

-
<type>
<type-enum value="(Not selected)"/>
<type-enum value="Important" value-is-set="true"/>
<type-enum value="Not important" value-is-set="true"/>
<type-enum value="Personal"/>
</type>
+ +
<type>
+  <type-enum value="(Not selected)"/>
+  <type-enum value="Important" value-is-set="true"/>
+  <type-enum value="Not important" value-is-set="true"/>
+  <type-enum value="Personal"/>
+</type>
+
+

...is transformed into something resembling this HTML code:

-
<select name="..." multiple="multiple">
<option value="(Not selected)">(Not selected)</option>
<option value="Important" selected="selected">Important</option>
<option value="Not important" selected="selected">Not important</option>
<option value="Personal">Personal</option>
</select>
+ +
<select name="..." multiple="multiple">
+  <option value="(Not selected)">(Not selected)</option>
+  <option value="Important" selected="selected">Important</option>
+  <option value="Not important" selected="selected">Not important</option>
+  <option value="Personal">Personal</option>
+</select>
+
+

Above, the special value-is-set attribute is an XSLForms mechanism to remember which values were set. Fortunately, the document initialisation mechanism automatically distinguishes between different multiple-choice field types and understands where the above approach needs to be employed.

-
    -

Updating the Web Resource

+ +

Updating the Web Resource

+

To update the special WebStack resource, we now need to modify a few of the class attributes and to add a few others:

-
    template_resources = {
"structure" : ("structure_multivalue_template.xhtml", "structure_output.xsl")
}
+ +
+    template_resources = {
+        "structure" : ("structure_multivalue_template.xhtml", "structure_output.xsl")
+        }
+
+

With these adjustments, it should now be possible to manipulate the items and subitems whilst specifying multiple type values on each item. Note that it may be necessary to remove the old stylesheet for producing output, structure_output.xsl, so that the multivalue version of the template is taken into use.

+

Improving the Presented Values

-

In the application we have been developing, we have been content to show the multiple-choice values as they are known in the application - that is, the application refers to values like Personal -and the same text is shown to users of the application. However, there -are various situations where this is not desirable, and the usage of separate labels is described in the next section of the development process.

+ +

In the application we have been developing, we have been content to show the +multiple-choice values as they are known in the application - that is, the +application refers to values like Personal and the same text is +shown to users of the application. However, there are various situations where +this is not desirable, and the usage of separate +labels is described in the next section of the development process.

+ diff -r fd003deb4d59 -r 0550b4fc2f5c docs/reference.html --- a/docs/reference.html Sun Nov 29 02:01:41 2009 +0100 +++ b/docs/reference.html Wed Feb 24 00:59:37 2010 +0100 @@ -172,6 +172,46 @@

The specified expression is evaluated in the context of the current element.

+

template:sort

+ +

This attribute imposes a particular ordering on elements retrieved from the +XML document being presented based on the expression provided as the value of +the attribute. Such an ordering directive only has an effect on sections of the +template where a template:element or element traversing annotation +(such as a multiple-choice annotation) is in use.

+ +

Example:

+ +
+<select template:multiple-choice-field="type,value" name="...">
+  <option template:multiple-choice-value="type-enum,value,selected,template:i18n(text())"
+    template:sort="template:i18n(text())" value="..." />
+</select>
+
+ +

In this example, the choices will each have a translated +label, but it would be desirable to sort these choices according to such labels, +instead of sorting them by some other criteria (such as the order in which they +are retrieved from a database or the English language order of the labels). +Thus, the template:sort annotation is used on the option +element, which will be replicated several times to provide all the values, such +that the outcome of this replication satisfies the ordering stated by the supplied +XPath expression template:i18n(text()) evaluated in the context of +each of the elements. In other words, the elements will be generated such that +their labels are ordered alphabetically.

+ +

Syntax:

+ +
XPath-expression
+ +

Related attributes:

+ +
  • template:element
  • +
  • template:multiple-choice-value
  • +
  • template:multiple-choice-list-value
  • +
  • template:attribute-list-button
  • +
+

Initialisation Annotations

The annotation attributes in this section control the initialisation of documents where this is done by the XSLForms toolkit.

diff -r fd003deb4d59 -r 0550b4fc2f5c examples/Common/VerySimple/Resources/structure_multivalue_label_template.xhtml --- a/examples/Common/VerySimple/Resources/structure_multivalue_label_template.xhtml Sun Nov 29 02:01:41 2009 +0100 +++ b/examples/Common/VerySimple/Resources/structure_multivalue_label_template.xhtml Wed Feb 24 00:59:37 2010 +0100 @@ -20,14 +20,16 @@

Item type: -

diff -r fd003deb4d59 -r 0550b4fc2f5c packages/ubuntu-feisty/python-xsltools/debian/changelog --- a/packages/ubuntu-feisty/python-xsltools/debian/changelog Sun Nov 29 02:01:41 2009 +0100 +++ b/packages/ubuntu-feisty/python-xsltools/debian/changelog Wed Feb 24 00:59:37 2010 +0100 @@ -38,8 +38,10 @@ document structure. * Added special attributes indicating the presence of file uploads, using a special file namespace in form documents. + * Added a template:sort annotation in order to control + the ordering of presented elements. - -- Paul Boddie Sat, 21 Mar 2009 00:30:28 +0100 + -- Paul Boddie Wed, 24 Feb 2010 00:58:14 +0100 xsltools (0.5-0ubuntu1) feisty; urgency=low diff -r fd003deb4d59 -r 0550b4fc2f5c packages/ubuntu-hoary/python2.4-xsltools/debian/changelog --- a/packages/ubuntu-hoary/python2.4-xsltools/debian/changelog Sun Nov 29 02:01:41 2009 +0100 +++ b/packages/ubuntu-hoary/python2.4-xsltools/debian/changelog Wed Feb 24 00:59:37 2010 +0100 @@ -38,8 +38,10 @@ document structure. * Added special attributes indicating the presence of file uploads, using a special file namespace in form documents. + * Added a template:sort annotation in order to control + the ordering of presented elements. - -- Paul Boddie Sat, 21 Mar 2009 00:32:48 +0100 + -- Paul Boddie Wed, 24 Feb 2010 00:57:47 +0100 xsltools (0.5-0ubuntu1) hoary; urgency=low