Tim,
This is now partially implemented and I would be happy to have your remarks.
Enabling this feature for just some nodes is not easy with mediatype
parameters. So, I have created a new action named "split" to create an
array node according to a separator and to perform left and right trim
according to a regular expression.
For your test form, it sounds like this:
<xf:split ev:event="xforms-model-construct-done"
ref="instance('result')/marc:collection/marc:record/marc:datafield[@tag
= '245']/marc:subfield[@code = 'c']" separator=";" left-trim="^\s\s*"
right-trim="(\s|\.)\s*$"/>
<xf:split ev:event="xforms-model-construct-done"
ref="instance('result')/marc:collection/marc:record/marc:datafield[@tag
= '508']/marc:subfield[@code = 'a']" separator=";" left-trim="^\s\s*"
right-trim="(\s|\.)\s*$"/>
<xf:split ev:event="xforms-model-construct-done"
ref="instance('result')/marc:collection/marc:record/marc:datafield[@tag
= '508']/marc:subfield[@code = 'a']/array()/text()" separator=","
left-trim="^\s\s*" right-trim="(\s|\.)\s*$"/>
<xf:split ev:event="xforms-model-construct-done"
ref="instance('result')/marc:collection/marc:record/marc:datafield[@tag
= '511']/marc:subfield[@code = 'a']" separator="," left-trim="^\s\s*"
right-trim="(\s|\.)\s*$"/>
As you can see, this action can be applied more than once on the same
subfield in case of embedded separators such as ";" then ",". The right
trim regular expression is able to remove the trailing ".". Maybe the
"^" and the "$" should be automatically added...
I have not yet implemented the new "+" feature for input so I have just
tested with static input controls. It should be possible to add XForms
triggers and actions to add/remove text items but I have not tested this
yet:
<xf:group
ref="marc:datafield[@tag = '245']/marc:subfield[@code =
'c']/array()">
<xf:repeat nodeset="text()">
<xf:input ref=".">
<xf:label>Production credit: </xf:label>
</xf:input>
</xf:repeat>
</xf:group>
and
<xf:group ref="marc:datafield[@tag =
'508']/marc:subfield[@code = 'a']/array()">
<xf:repeat nodeset="array()">
<xf:input ref="text()">
<xf:label>Role: </xf:label>
</xf:input>
<xf:repeat nodeset="node()[preceding-sibling::node()]">
<xf:input ref=".">
<xf:label>Role by: </xf:label>
</xf:input>
</xf:repeat>
</xf:repeat>
</xf:group>
I have seen that the first item in sub-values has a special meaning so I
have isolated it from the corresponding repeat. The corresponding XPath
expression should naturally be "text()[preceding-sibling::text()]" but
the XPath parser has currently an issue with it so I just tested with
the more general expression "node()[preceding-sibling::node()]".
This is not serialized back yet because I have questions about this.
While the parsing separator can be just a single character, would not
you prefer to have a serialized return with a separator followed by a
single space character? Should the ending "." be added back? If so, my
idea is to add attributes to the split action to allow the serializer to
perform this. These parameters could be stored as attributes of the
array node.
What do you think?
Alain
Le 20/11/2015 18:50, Tim Thompson a écrit :
Alain,
This approach sounds very promising! Yes, I think it would be
preferable to have the ability to specifically enable/disable the "+"
feature as you suggest.
Best regards,
Tim
--
Tim A. Thompson
Metadata Librarian (Spanish/Portuguese Specialty)
Princeton University Library
On Fri, Nov 20, 2015 at 12:13 PM, Alain Couthures
<[email protected] <mailto:[email protected]>>
wrote:
Tim,
The best approach could be to mix the two approaches:
* let's define a mediatype such as "application/xml+csv" with an
optional parameter named "separator"
* add support for this new mediatype in Fleur, my new DOM
implementation I presented at XML Amsterdam, so each text
value containing a separator is splitted into an array node
with as many text nodes as items
* add support of arrays in XSLTForms input controls: as many
HTML inputs as items with "+" and "-" buttons for each to add
and delete items (every XForms input control for single
strings will actually have a "+" button to allow to generate
an array from them)
Would it be better for you to specifically enable/disable the "+"
feature for, let's say, attributes, some elements, depending on
the namespace, ...?
What do you think?
Alain
Le 20/11/2015 04:26, Tim Thompson a écrit :
Yes, library catalog data is notorious for using punctuation to
indicate structure (a legacy of the card catalog days).
Your proposal seems like a great, declarative solution, and I
think it would be a valuable extension for XSLTForms. It could
also be interesting if the XForms 2.0 CSV2XML mapping could be
applied to the text content of individual elements (rather than
only instances), so that it could be accessed using XPath.
Best regards,
Tim
--
Tim A. Thompson
Metadata Librarian (Spanish/Portuguese Specialty)
Princeton University Library
On Thu, Nov 19, 2015 at 3:36 PM, Alain Couthures
<[email protected]
<mailto:[email protected]>> wrote:
Tim,
This is a very interesting test case because it shows that
some elements might contain multiple values separated by ";".
It looks like CSV contents within elements!
I don't think fn:tokenize is the right tool for this
situation: it is designed for returning strings not nodes to
be bound to controls. It is true that XSLTForms is using
faked nodes for returning what can be seen as a sequence but
it is just a trick for an XPath 1.0 engine.
I have been thinking of a way for splitting the text node
which is the child of the element into many and, then, it
would be possible to bind them individually for editing. I am
not sure that all DOM implementations in browsers will
support adjacent text nodes without concatenate them. An
XPath function should not modify nodes so a specific action
would be required...
It should be better, first, to consider that the element
value has a specific data type, which is a restriction of
xsd:string. As for RTE, the separator to be recognized can be
associated to this data type. Then, the input control bound
to each element with this data type will actually be rendered
by XSLTForms with multiple HTML inputs, as many as
sub-values, and with buttons to add and remove inputs. This
would be developed as an XForms extension in XSLTForms.
What do you think?
Alain
Le 18/11/2015 23:34, Tim Thompson a écrit :
Alain,
Thank you for your reply. Attached is a test case using
fn:tokenize to create input controls. The purpose is to edit
library catalog records for audiovisual material and
transcribe information about production credits.
Best regards,
Tim
--
Tim A. Thompson
Metadata Librarian (Spanish/Portuguese Specialty)
Princeton University Library
On Wed, Nov 18, 2015 at 3:57 PM, Alain Couthures
<[email protected]
<mailto:[email protected]>> wrote:
Tim,
Currently, fn:tokenize() is returning faked text nodes.
This is good enough for xf:output and should also work
with xf:setvalue.
It would still be easy to create standalone text nodes
owned by default instance to do the trick more
appropriately for complex cases.
Could you please send me a test case?
Thanks!
--Alain
Le 18/11/2015 20:02, Tim Thompson a écrit :
Alain,
Can fn:tokenize be used to update instance data with
xf:input, or only to display data with xf:output? I
have XML data with elements that contain
semicolon-delimited strings that I would like to split
across separate input controls, but I guess the data
can't be updated once it is tokenized?
Best wishes,
Tim
--
Tim A. Thompson
Metadata Librarian (Spanish/Portuguese Specialty)
Princeton University Library
------------------------------------------------------------------------------
_______________________________________________
Xsltforms-support mailing list
[email protected]
<mailto:[email protected]>
https://lists.sourceforge.net/lists/listinfo/xsltforms-support
------------------------------------------------------------------------------
_______________________________________________
Xsltforms-support mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/xsltforms-support