On Wed, Jun 2, 2010 at 3:32 AM, Christian Schouten
<C(_dot_)Schouten(_at_)duthler(_dot_)nl> wrote:
Hi all,
I need to apply an XSL transformation to a non-xml file that has a fixed
structure.
The goal is to read in the file, add/edit/delete a record and write it
back.
The FXSL library provides a complete, generic LR-1 parser and a tool
(modified YACC) that from the BNF rules for an LR-1 language produces
a set of rules and tables in XML format for the generic parser to use.
I have used these to create a range of parsers -- from toy arithmetic
expressions, to JSON to XPath 2.0. The kind of effort involved is
comparable with the one using YACC.
I have provided an example of using the function f:lrParse() to parse
a JSON instance in my blog:
http://dnovatchev.spaces.live.com/blog/cns!44B0A32C2CCF7488!367.entry
f:lrParse can be downloaded with FXSL or can be viewed here:
http://fxsl.cvs.sourceforge.net/fxsl/fxsl-xslt2/f/func-lrParse.xsl?view=markup&sortby=date
The parser for JSON can be downloaded with FXSL or or can be viewed here:
http://fxsl.cvs.sourceforge.net/viewvc/fxsl/fxsl-xslt2/f/func-json-document.xsl?revision=1.11&view=markup&sortby=date
The parsing tables for JSON, generated by YACCX can be downloaded with
FXSL or can be viewed here:
http://fxsl.cvs.sourceforge.net/viewvc/fxsl/fxsl-xslt2/f/parseTables-Jason.xml?revision=1.1&view=markup&sortby=date
YACCX can be downloaded as part of FXSL or can be viewed here:
http://fxsl.cvs.sourceforge.net/viewvc/fxsl/fxsl-xslt2/Tools/YACCX/?sortby=date
--
Cheers,
Dimitre Novatchev
---------------------------------------
Truly great madness cannot be achieved without significant intelligence.
---------------------------------------
To invent, you need a good imagination and a pile of junk
-------------------------------------
Never fight an inanimate object
-------------------------------------
You've achieved success in your field when you don't know whether what
you're doing is work or play
A sample file (start to finish) is as below:
===
package Endpoints;
#generated from Decision Table
import bre.Endpoint;
rule "Endpoints #1: (Endpoint.urlEndpoint =='\"https://a.b.c/d\"')"
salience 0
when
endpoint:Endpoint(urlEndpoint==
"https://a.b.c/d")
then
endpoint.setStatus("OK");
end
rule "Endpoints #2: (Endpoint.urlEndpoint =='\"https://w.x.y/z\"')"
salience 0
when
endpoint:Endpoint(urlEndpoint==
"https://w.x.y/z")
then
endpoint.setStatus("OK");
end
===
How would I best approach this? My thoughts were:
* Open file (inside a jar)
* Skip three-line header
* Use analyze-string/matching-substring to split into records defined as
something like "^rule \"Endpoints #[A-Za-z0-9:;/]*end$"
* Use string analysis functions to split into fields urlEndpoint and
Status
* Magically end up with
<Endpoints><Endpoint><urlEndpoint>https://a.b.c/d</urlEndpoint><Status>O
K</Status></Endpoint><Endpoint><urlEndpoint>https://w.x.y/z</urlEndpoint
<Status>OK</Status></Endpoint></Endpoints>
* Perform requested operation (remove item from tree, add item to tree
etc.)
* Write back changed file (inside the jar)
The file header is made up as: package $tableName;\n#generated from
Decision Table\nimport bre.$className;
Each record is made up as: rule "$tableName #1:
($className.$conditionName =='\"$conditionValue\"')"\n\t\n\tsalience
0\n\twhen\n\t\tendpoint:Endpoint(\n?urlEndpoint==
"$conditionValue")\n\tthen\n\t\t$objectName.set$actionName("$actionValue
");\nend\n\n
So far, I can come up with the theory up to splitting the file into
records that are delimited by the word 'rule' at the start of a line and
the word 'end' as its own line and I can come up with a definition for
how a record is made up from field. Actually splitting the records into
fields within XSL however is too much black magic for me right now. If
anybody could share his/her thoughts that'd be most appreciated...
Best regards,
Christian C. Schouten
--~------------------------------------------------------------------
XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list
To unsubscribe, go to: http://lists.mulberrytech.com/xsl-list/
or e-mail:
<mailto:xsl-list-unsubscribe(_at_)lists(_dot_)mulberrytech(_dot_)com>
--~--
--~------------------------------------------------------------------
XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list
To unsubscribe, go to: http://lists.mulberrytech.com/xsl-list/
or e-mail: <mailto:xsl-list-unsubscribe(_at_)lists(_dot_)mulberrytech(_dot_)com>
--~--