Excuse me for being pure Java and not knowing Sword C++ at all but can I add (perhaps obviously) that an XSLT framework will perform noticeably slower than a SAX-like framework.<div><br></div><div><a href="http://java.sun.com/developer/technicalArticles/xml/JavaTechandXML_part2/">Here </a>are some performance comparisons.  They are old and Java-centric and so XSLT performance may have improved but these tests show that in the worst case XSLT was 3 times slower than SAX and a good SAX processor was twice as fast as a good XSLT processor.  If pages are parsed at the chapter level then users may notice a delay turning pages on smaller machines like mobile phones.</div>
<div><br></div><div>Martin<br><br><div class="gmail_quote">On 1 December 2010 12:20, Troy A. Griffitts <span dir="ltr">&lt;<a href="mailto:scribe@crosswire.org">scribe@crosswire.org</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
The logic to get from any Publisher Source Document to rendered HTML is<br>
a very complex task to solve.<br>
<br>
We conceptually create Plato&#39;s Form of, say, a Bible, and try to fit<br>
imperfect Publisher markup into this concept.  A Bible has verses,<br>
headings between verses, chapter intros, footnotes, crossrefs, lemma<br>
information, etc.<br>
<br>
If we do not do this, then we become a PDF reader-- there are already<br>
PDF readers and we lose the ability to do Bible specific things with our<br>
software.  For example, if we didn&#39;t normalize the concept of crossref<br>
across all Books, then we couldn&#39;t turn them on and off; we couldn&#39;t<br>
provide a crossref panel in the reader which fills according to which<br>
crossref is hovered over, etc.  Same with notes, strongs, headings, etc.<br>
<br>
This causes us to impose our Form onto a publisher&#39;s text.  I understand<br>
why some people may not like this, but it is very much to our end users&#39;<br>
benefit that we do this.  Without this, we become a web-browser or a PDF<br>
reader.  Which are fine for their purpose, but we intend to provide<br>
common, familiar, and sometimes novel Bible study aides to our reader.<br>
<br>
The current processing model is dark magic and I apologize for this.  It<br>
should be well documented and easy to modify.  I will attempt to improve<br>
the dissemination of knowledge of exactly WHAT our Forms are, how we<br>
impose those Forms on publishers&#39; texts and improve the documentation<br>
and code to help others understand and have the ability to improve the code.<br>
<br>
I&#39;ll attempt to post a few easy to swallow SWORD 101 classes in email,<br>
which will help us gather our thoughts and documents on how all this works.<br>
<font color="#888888"><br>
<br>
Troy<br>
</font><div><div></div><div class="h5"><br>
<br>
<br>
On 12/01/2010 12:09 AM, Greg Hellings wrote:<br>
&gt; On Tue, Nov 30, 2010 at 1:08 PM, Troy A. Griffitts &lt;<a href="mailto:scribe@crosswire.org">scribe@crosswire.org</a>&gt; wrote:<br>
&gt;&gt; Having finally returned from a hectic 2 weeks of conferences, and lots<br>
&gt;&gt; to do before leaving for Christmas, I&#39;m not sure I&#39;m up for a heated,<br>
&gt;&gt; passionate debate about technologies right now, but by all means, please<br>
&gt;&gt; commence the public discussion.<br>
&gt;&gt;<br>
&gt;&gt; Let me start by saying that everyone (I believe) agrees that we would<br>
&gt;&gt; like to have an HTML output from the engine which is more generic and<br>
&gt;&gt; would allow CSS to be applied if a frontend would like to do this.<br>
&gt;&gt; Currently HTMLHREF output from the engine is used by the widest number<br>
&gt;&gt; of frontends (to my knowledge) and would benefit everyone involved by<br>
&gt;&gt; becoming much more generic. e.g.,<br>
&gt;&gt;<br>
&gt;&gt; &lt;title&gt; -&gt; &lt;h1&gt;<br>
&gt;&gt; rather than<br>
&gt;&gt; &lt;title&gt; -&gt; &lt;b&gt;&lt;br /&gt;<br>
&gt;&gt;<br>
&gt;&gt; &lt;transChange type=&quot;added&quot;&gt; -&gt; &lt;span class=&quot;tcAdded&quot;&gt;<br>
&gt;&gt; rather than<br>
&gt;&gt; &lt;transChange type=&quot;added&quot;&gt; -&gt; &lt;i&gt;<br>
&gt;&gt;<br>
&gt;&gt; etc.<br>
&gt;&gt;<br>
&gt;&gt; I believe this will solve a number of issues and possibly get the BT and<br>
&gt;&gt; MacSword teams onboard to using the same HTML output filters as the<br>
&gt;&gt; other projects involve (or at least subclassing them and using the<br>
&gt;&gt; majority of their functionality).<br>
&gt;<br>
&gt; I think this is our pretty well accepted premise.  The current filters<br>
&gt; stink to various degrees and currently no one is willing to step up<br>
&gt; and tackle them.<br>
&gt;<br>
&gt;&gt;<br>
&gt;&gt;<br>
&gt;&gt; Now, as to the other issue of using XSLT internally in the engine to<br>
&gt;&gt; process OSIS -&gt; HTML<br>
&gt;&gt;<br>
&gt;&gt; I will throw a few melons into the air for target practice, and let the<br>
&gt;&gt; shooting commence.<br>
&gt;&gt;<br>
&gt;&gt; _____________________________<br>
&gt;&gt; *Multiple Language*<br>
&gt;&gt;<br>
&gt;&gt; XSLT is a programming language in the same sense that C++ is a<br>
&gt;&gt; programming language.<br>
&gt;&gt;<br>
&gt;&gt; The SWORD Project C++ engine is written in C++.  It is not a Python<br>
&gt;&gt; engine; it is not a Perl engine; it is not a Java engine; it is C++.<br>
&gt;&gt;<br>
&gt;&gt; One might say, &quot;Well, you can use XSLT from C++.  Doesn&#39;t JSword do this<br>
&gt;&gt; from Java?&quot;  Well, yes, of course you can, and DM can comment, if he<br>
&gt;&gt; feels the desire to recommend his decision to encorporate an XSLT engine<br>
&gt;&gt; into the JSword logic flow.  But simply because one CAN doesn&#39;t mean one<br>
&gt;&gt; SHOULD.  We COULD encorporate a Perl text processing engine in our C++<br>
&gt;&gt; code, or an Awk processing engine...  that doesn&#39;t mean we SHOULD.  I&#39;m<br>
&gt;&gt; sure some would say we SHOULD.  And obviously DM has thought he SHOULD<br>
&gt;&gt; encorporate XSLT processing for JSword, so I&#39;m not intending to say it<br>
&gt;&gt; is a BAD decision, just that it is not a decision I would make; in the<br>
&gt;&gt; same way as our projects each chose C++ vs. Java to implement our objective.<br>
&gt;<br>
&gt; If a developer is going to develop OSIS -&gt; HTML filters, for instance,<br>
&gt; we are already assuming they know OSIS and HTML.  OSIS is XML and HTML<br>
&gt; is SGML (though most of our work is probably targetting a more<br>
&gt; XML-dialect of HTML).  XSLT is also XML.  Formally, it is not even a<br>
&gt; programming language, but just a set of formatting/processing<br>
&gt; instructions in XML.<br>
&gt;<br>
&gt; Any developer using XML who is worth their salt should at least be<br>
&gt; familiar with the basics of XSL - they may not be a guru of XPath<br>
&gt; expressions or have every attribute of XSL memorized - and would<br>
&gt; probably expect a library which handles XML as its preferred input<br>
&gt; method to utilize one of the standard XML processing methods.  I know<br>
&gt; I&#39;m not the only person who was surprised to look in the library<br>
&gt; filters and see neither DOM, SAX nor XSLT technologies in use.  That<br>
&gt; was when I first ran and hid.<br>
&gt;<br>
&gt; Of course, this portion of the discussion is only relevant for the<br>
&gt; from-OSIS filters.<br>
&gt;<br>
&gt;&gt;<br>
&gt;&gt; _______________________<br>
&gt;&gt; *XSLT better than C++*<br>
&gt;&gt;<br>
&gt;&gt; One might say, &quot;well, XSLT is better suited to process XML than C++.&quot;<br>
&gt;&gt; That&#39;s a loaded and unquantified statement.<br>
&gt;&gt;<br>
&gt;&gt; Certainly the C++ language specification doesn&#39;t include facilities to<br>
&gt;&gt; easily process XML, but that doesn&#39;t mean a plethora of C++ libraries<br>
&gt;&gt; don&#39;t exists for assisting in this task.<br>
&gt;&gt;<br>
&gt;&gt; The SWORD engine includes classes like XMLTag and SWBasicFilter which<br>
&gt;&gt; implement a SAX processing model.<br>
&gt;&gt;<br>
&gt;&gt; The current filters do not all use SWBasicFilter, nor XMLTag.  They&#39;ve<br>
&gt;&gt; been written over 15 years and many before these classes existed.  Some<br>
&gt;&gt; are ugly and need to be rewritten for readability, certainly.  But not<br>
&gt;&gt; necessarily in a different programming language.<br>
&gt;<br>
&gt; XSLT being &quot;better&quot; is, yes, a matter of complete subjectivity.  And,<br>
&gt; as I mentioned above, is only useful when our source is XML to begin<br>
&gt; with.  For GBF or Plaintext sources, XSLT is clearly not even<br>
&gt; applicable.<br>
&gt;<br>
&gt; But the current C++ is so good that you seem the only person willing<br>
&gt; to touch it.  Peter just mentioned he tried once and couldn&#39;t get it.<br>
&gt; I have gone into the filters before with a singular goal in mind and<br>
&gt; was able to produce my desired changes, but it was long, drawn-out and<br>
&gt; painful.  Doing the same tasks in XSL would have taken me mere<br>
&gt; seconds.  I know a few other people, at least, have said they would<br>
&gt; know how to do a task if XSLT was used instead of C++.  Of course,<br>
&gt; that is a hypothetical - I can&#39;t know that they would have done so,<br>
&gt; but that was their claim at the time.<br>
&gt;<br>
&gt; Our recent discussion about the use of the &quot;n&quot; attribute for footnotes<br>
&gt; in ThML is a perfect example.  Maintaining the attribute in XSL would<br>
&gt; have been a trivial task I could have handled in seconds.  Instead, it<br>
&gt; required you, myself and Karl and took about 10 days to get fixed.<br>
&gt; You had to alert Karl and me to presence of the attributes, I provided<br>
&gt; him a preliminary patch to incorporate the values, then he had to<br>
&gt; heavily modify the patch to operate correctly in non-ThML source and a<br>
&gt; few other corner cases.  And, in the end, the fix is only in Xiphos&#39;<br>
&gt; code base - I would have to go through 2 of those three steps again in<br>
&gt; Bibletime, BPBible, MacSword and any other applications I wanted to<br>
&gt; see proper behavior in.  Alternatively I could tackle the filters -<br>
&gt; but I&#39;m not really inclined to do so.<br>
&gt;<br>
&gt; Is XSLT &quot;better&quot;?  For me, it would be better because I could more<br>
&gt; easily modify its behavior based on the fact that I know XML and could<br>
&gt; easily locate the necessary processing directive.  For you, maybe not.<br>
&gt;  Are there things you simply cannot do in XSL that C++ can? Yes.  IMO<br>
&gt; the benefits of XSL outweigh the benefits of C++ for this task, but<br>
&gt; you clearly disagree. :)  I would also say that DOM or SAX processing<br>
&gt; would be better for all the same reasons - it shields the user from<br>
&gt; having to see the XML parsing and handle inconsistencies in<br>
&gt; whitespace, validation, etc and is still a decently well-known<br>
&gt; technology among XML users (even if it&#39;s slightly less well-known than<br>
&gt; XSL).  And with a DOM or SAX parser, you could still happily employ<br>
&gt; the full power of C++.<br>
&gt;<br>
&gt;&gt;<br>
&gt;&gt; ________________________<br>
&gt;&gt; *COMPLEXITY*<br>
&gt;&gt;<br>
&gt;&gt; The task of enumerating all types of OSIS &lt;title&gt; tags, and deciding<br>
&gt;&gt; what to do with each, and how to classify all &lt;title&gt; tags from all<br>
&gt;&gt; possible OSIS documents into our enumeration is still going to be a<br>
&gt;&gt; complex task using XSLT.  &lt;title&gt; is a complex example, but certainly<br>
&gt;&gt; not the most complex.<br>
&gt;&gt;<br>
&gt;&gt; It is a tall task to generalize all elements of all documents from all<br>
&gt;&gt; publishers into one conceptual model with one chosen output for a<br>
&gt;&gt; frontend-- whether that be for an audience on the Desktop, web-based, or<br>
&gt;&gt; a handheld.<br>
&gt;&gt;<br>
&gt;&gt; The complex processing required by the engine will require long, complex<br>
&gt;&gt; XSLT-- which likely will encorporate callbacks to C++.  It will not be<br>
&gt;&gt; more simple-- only mixed language.<br>
&gt;<br>
&gt; I could also argue that the XSL would not require a developer to<br>
&gt; mentally filter out the code that just identifies and locates XML<br>
&gt; elements and attributes and parses them from the code that transforms<br>
&gt; them and generates the output.  Thus yes, it might include some<br>
&gt; extension functions into C++ but it would be simpler.  And it would<br>
&gt; also be more expressive.<br>
&gt;<br>
&gt; The enumeration of every OSIS &lt;title&gt; tag is a moot point for the<br>
&gt; decision.  You need to enumerate them all in C++ as well and decide<br>
&gt; what to do with them.  That doesn&#39;t change in the XSL - just the<br>
&gt; method used.  An XSL match along the lines of &lt;xsl:template<br>
&gt; match=&quot;title[@type=psalm]&quot;&gt; still has to be done in C++ with some sort<br>
&gt; of if(<a href="http://tag.name" target="_blank">tag.name</a>() == &quot;title &amp;&amp; tag.attr(&quot;type&quot;) == &quot;psalm&quot;) or whatever<br>
&gt; the syntax is.  And that is assuming the current filter is using<br>
&gt; XMLTag and isn&#39;t comparing character strings directly.<br>
&gt;<br>
&gt;&gt; _______________________<br>
&gt;&gt; *Semantic vs. Display*<br>
&gt;&gt;<br>
&gt;&gt; Some will say (and have), &quot;well, let everything be display oriented and<br>
&gt;&gt; let the publisher decide&quot;.  Fine, then you lose 2 things: the ability to<br>
&gt;&gt; display differently per user preference, per display device; and you<br>
&gt;&gt; also give up the promise to actually do any interesting research on the<br>
&gt;&gt; text.  When you lose semantic markup, then you lose all interesting<br>
&gt;&gt; information about WHAT is being marked up.<br>
&gt;<br>
&gt; I just want to be clear that I&#39;m not advocating the use of display<br>
&gt; over semantics as a general choice.  My statements are strictly based<br>
&gt; around my specific task and the fact that OSIS support in SWORD and<br>
&gt; the front ends is not as good as the support of ThML.  Largely this is<br>
&gt; because most applications display in HTML and my required task is<br>
&gt; framed entirely in terms of the presentation and display - not the<br>
&gt; semantics.  I would love and prefer to use OSIS for this task, but I<br>
&gt; simply cannot accomplish it with the state of SWORD at this time.<br>
&gt;<br>
&gt;&gt;<br>
&gt;&gt; _______________________<br>
&gt;&gt; *More than a Rending Engine*<br>
&gt;&gt;<br>
&gt;&gt; The SWORD C++ Engine is more than simply a text rendering engine-- it is<br>
&gt;&gt; a Biblical text research engine.<br>
&gt;&gt;<br>
&gt;&gt; If I&#39;d like to know the morphology of word 3 in 2Thes 2.13 of the WHNU<br>
&gt;&gt; Greek text, the entire program to do such is:<br>
&gt;&gt;<br>
&gt;&gt; SWMgr library;<br>
&gt;&gt; SWModule *whnu = library.getModule(&quot;WHNU&quot;);<br>
&gt;&gt; whnu-&gt;setKey(&quot;2th.2.13&quot;);<br>
&gt;&gt; whnu-&gt;RenderText();<br>
&gt;&gt;<br>
&gt;&gt; cout &lt;&lt; &quot;The morphology of word three is: &quot; &lt;&lt;<br>
&gt;&gt; whnu-&gt;getEntryAttributes()[&quot;Word&quot;][&quot;003&quot;][&quot;Morph&quot;] &lt;&lt; endl;<br>
&gt;&gt;<br>
&gt;&gt;<br>
&gt;&gt; That reads nice (at least in my opinion).  I don&#39;t need to know about<br>
&gt;&gt; XML, XSLT, care what markup the WHNU module uses, I don&#39;t even have to<br>
&gt;&gt; know how to make a SWORD filter.  The current filters do all the work of<br>
&gt;&gt; breaking out these attributes and making them available in a nice and<br>
&gt;&gt; interesting map.<br>
&gt;<br>
&gt; I&#39;d like to be clear again, that XSL would only be useful for material<br>
&gt; already in OSIS formats (or in valid ThML - I think TEI is also an XML<br>
&gt; format?).  I doubt many modules in ThML are strictly valid at their<br>
&gt; import times, so XSL wouldn&#39;t be very useful, and GBF is a monster<br>
&gt; unto itself.  Doing the above in XSL from an OSIS source would not be<br>
&gt; much different in complexity than what you have listed there.<br>
&gt;<br>
&gt; &lt;xsl:template match=&quot;verse[@osisID=&#39;2thes.2.13&#39;]/w[@n=3]&quot;&gt;<br>
&gt; The morphology of word three is: &lt;xsl:value-of select=&quot;@morph&quot; /&gt;<br>
&gt; &lt;/xsl:template&gt;<br>
&gt;<br>
&gt; Or something similar (my knowledge of exact OSIS attribute names and<br>
&gt; values wanes and it&#39;s been two or three weeks since I wrote an XPath<br>
&gt; expression).<br>
&gt;<br>
&gt; Of course, the string processing portion of SWORD would continue to be<br>
&gt; of great importance for any modules in GBF format or similar to bring<br>
&gt; them into a useful form.  In that way, SWORD would continue to be more<br>
&gt; than just a text rendering engine.  It would continue to offer all of<br>
&gt; its features, its buffering from the system and from the format, its<br>
&gt; indexing, its module fetching and storing, etc.<br>
&gt;<br>
&gt;&gt; ______________________<br>
&gt;&gt;<br>
&gt;&gt;<br>
&gt;&gt; And finally, if bullets aren&#39;t flying already, I&#39;ll stir the heat up with...<br>
&gt;&gt;<br>
&gt;&gt; XSLT sucks.  A good C++ programmer can do anything in C++ better than<br>
&gt;&gt; any XSLT programmer.<br>
&gt;&gt;<br>
&gt;&gt;<br>
&gt;&gt; :)<br>
&gt;<br>
&gt; A C++ programmer can definitely do more, since C++ is actually a<br>
&gt; programming language and XSLT is a set of processing instructions.<br>
&gt; Better?  That depends on what the criteria is.  For me, in my current<br>
&gt; role as a module creator, the use of C++ is not currently better<br>
&gt; because it is less flexible and extensible.  For you, as the library<br>
&gt; maintainer, perhaps C++ is better because it&#39;s what you are already<br>
&gt; comfortable with and because it has largely been your hand in the<br>
&gt; filters.<br>
&gt;<br>
&gt;&gt;<br>
&gt;&gt; *duck*<br>
&gt;&gt; Have fun.<br>
&gt;&gt;<br>
&gt;&gt; Troy<br>
&gt;&gt;<br>
&gt;&gt; PS.  In summary, I understand the current filters are sometimes overly<br>
&gt;&gt; complex and need cleanup, standardization, etc.  It comes down to the<br>
&gt;&gt; fact that they mostly work, and other things which don&#39;t get priority,<br>
&gt;&gt; so they don&#39;t get much attention.  But honestly, I think one might be<br>
&gt;&gt; oversimplifying the problem at hand without realizing it, if one simply<br>
&gt;&gt; thinks switching to XSLT will make things easier.<br>
&gt;<br>
&gt; I think one is also oversimplifying the options.  My dreamlist is that<br>
&gt; SWORD produce a well-formed, valid, complete OSIS document for an<br>
&gt; arbitrary KeyList that I pass it with FMT_OSIS set.  That basically<br>
&gt; boils down to getting the *OSIS filters up to snuff and standardized.<br>
&gt; The second item on the list is a readily extensible mechanism for<br>
&gt; SWORD outputting HTML from that OSIS.  If that choice is providing an<br>
&gt; XSL stylesheet with the library, a C++ SAX processor that a front-end<br>
&gt; can readily extend, a DOM interface that can be easily customized is<br>
&gt; immaterial to me.  I like all three of those, and can easily<br>
&gt; understand and extend all of them.<br>
&gt;<br>
&gt; I think any of those technologies would be an improvement over all<br>
&gt; in-house C++ for the second half of any such processing.  If we are<br>
&gt; using XML in Open Source Software, let&#39;s leverage the work of others<br>
&gt; who have happily given us permission to use their libraries!<br>
&gt;<br>
&gt; --Greg<br>
&gt;<br>
&gt; _______________________________________________<br>
&gt; sword-devel mailing list: <a href="mailto:sword-devel@crosswire.org">sword-devel@crosswire.org</a><br>
&gt; <a href="http://www.crosswire.org/mailman/listinfo/sword-devel" target="_blank">http://www.crosswire.org/mailman/listinfo/sword-devel</a><br>
&gt; Instructions to unsubscribe/change your settings at above page<br>
<br>
<br>
_______________________________________________<br>
sword-devel mailing list: <a href="mailto:sword-devel@crosswire.org">sword-devel@crosswire.org</a><br>
<a href="http://www.crosswire.org/mailman/listinfo/sword-devel" target="_blank">http://www.crosswire.org/mailman/listinfo/sword-devel</a><br>
Instructions to unsubscribe/change your settings at above page<br>
</div></div></blockquote></div><br></div>