xsl-list
[Top] [All Lists]

RE: creating canonRef from flat

2003-09-19 08:45:49
Starting with
<r>Mateus 3.1-12; Lucas 3.1-20; </r>
I want
<parallelPassage>
        <canonRef book="MAT" chapter="3" verse="1" verseEnd="12"/>
        <canonRef book="LUK" chapter="3" verse="1" 
verseEnd="20"/> </parallelPassage>

I have just switched to 2.0 as it seemed the regular 
expressions would 
help me here.

Yes, this kind of "up-conversion" is an excellent use case for
<xsl:analyze-string>

My thinking is to look in <r> and replace "Mateus" with 
"<book>MAT</book>" 
and "Lucas" with "<book>LUK</book>" ... and all the rest
and in a second pass change

<r><book>MAT</book> 3.1-12; <book>LUK</book> 3.1-20; </r>
<r>
        <book>MAT</book> 
        <chapter>3</chapter>
        <verse>1</verse>
        <verseEnd>12</verseEnd> 
        <book>LUK</book>
        <chapter>3</chapter>
        <verse>1</verse>
        <verseEnd>20</verseEnd 
</r>
and then put in final form in third pass
<parallelPassage>
        <canonRef book="MAT" chapter="3" verse="1" verseEnd="12"/>
        <canonRef book="LUK" chapter="3" verse="1" 
verseEnd="20"/> </parallelPassage>

Am I headed in the right direction? Or are there some really neat 
shortcuts?

I would have thought it could be done more easily than that. Something
like (untested):

<xsl:analyze-string select="r" regex="[^;]+">
  <xsl:matching-substring>
    <canonRef>
    <xsl:analyze-string select="." 
          regex="([^\s]+)\s([0-9]+)\.([0-9]+)\-([0-9]+)">
      <xsl:matching-substring>
        <xsl:attribute name="book" select="my:abbrev(regex-group(1))"/>
        <xsl:attribute name="chapter" select="regex-group(2)"/>
        <xsl:attribute name="verse" select="regex-group(3)"/>
        <xsl:attribute name="verseEnd" select="regex-group(4)"/>
      </
    </
    </canonRef>
  </
</

[Correction, xsl:attribute doesn't take a select attribute - but watch
this space]

<xsl:function name="my:abbrev">
  <xsl:param name="long-name"/>
  <xsl:variable name="table">
    <book long="Mateus" short="MAT"/>
    <book long="Lucas" short="LUK"/>
    ...
  </xsl:variable>
  <xsl:sequence select="$table/book[(_at_)long=$long-name]/@short"/>
</xsl:function>

If I use replace will I need to have it nested 66 times to 
account for all 
books?

No, use a lookup table as above.


Jim Albright
704 843-0582
Wycliffe Bible Translators



 XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list



 XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list



<Prev in Thread] Current Thread [Next in Thread>