[Bug 23643] New: Convenient operator for transform expressions

https://www.w3.org/Bugs/Public/show_bug.cgi?id=23643

            Bug ID: 23643
           Summary: Convenient operator for transform expressions
           Product: XPath / XQuery / XSLT
           Version: Working drafts
          Hardware: PC
                OS: Windows NT
            Status: NEW
          Severity: normal
          Priority: P2
         Component: Update 3.0
          Assignee: john.snelson@marklogic.com
          Reporter: christian.gruen@gmail.com
        QA Contact: public-qt-comments@w3.org

The XQUF transform expression has turned out to be an essential operation when
it comes to updating XML documents in main-memory. From our perspective,
however, it has the following shortcomings:

* Its verbose syntax makes updatable expressions inconvenient to read. The
copy/modify/return construct is particularly bulky when being embedded in
another FLWOR expression.

* Our users frequently mix up the components of FLWOR and transform
expressions. For many, it is hard to grasp why "copy" cannot be used in row
with "for" or "let".

* Most transform expressions we have encountered so far contain a single copy
variable and return the modified value without further modifications.

This is why I would like to propose a "modify" operator for XQUF 3.0, which
would require only few modifications in the grammar:

  AndExpr        ::= ModifyExpr ( "and" ModifyExpr )*
  ModifyExpr     ::= ComparisonExpr ( "!!" ComparisonExpr )?
  ComparisonExpr ::= ...

The modify operator works similar to the XQuery 3.0 map operator (and the "!!"
token has been chosen for that reason): the value of the first expression is
bound as context item, and the second expression performs updates on this item.
The updated item is returned as result. 

>From the implementation point of view, this extension is straightforward:

* It can completely be derived from the transform expression.
* Error codes are the same, too (XUST0002, XUTY0013).

This is a little example how an expression may look like before and after:

* Using the transform expression:

  for $e in //item[@status ne 'up-to-date'] 
  let $c :=
    copy $c := $e
    modify insert node <sub/> into $c
    return $c
  return element updated { $c }

* Using the modify operator:

  for $e in //item[@status ne 'up-to-date'] 
  let $c := $e !! insert node <sub/> into .
  return element updated { $c }

I’m looking forward to the discussion.

-- 
You are receiving this mail because:
You are the QA Contact for the bug.

Received on Saturday, 26 October 2013 13:54:25 UTC