Иерархия xml / обработка xsl с помощью tei:note

У меня есть то, что, я надеюсь, является лишь симптомом моего невежества, а не невозможной проблемой, но я не могу на всю жизнь заставить это работать.

Я собираю сноски, используя пространство имен TEI для XML, и соответствующие данные упакованы следующим образом:

<surface xml:id="EETS.T.29">
            <label>Verse 29</label>
            <graphic url="/Images/IMG_0479.JPG"/>
            <zone>
                <line>
                    <orig><hi>N</hi>ow in <damage>th</damage>e name of oure lord ihesus</orig>
                </line>
                <line>
                    <orig>of right hool herte <ex>&amp;</ex> in our<ex>e</ex>
                        <note place="bottom" anchored="true" xml:id="explanatory">Although “r” on the
                        painted panels of the chapel is consistently written with an otiose mark
                        when it concludes a word, the mark here is rendered more heavily and
                        with a dot indicating suspension above the r. This rendering as “oure”
                        is a linguistic outlier for the area based on the electronic <emph
                        rend="italic">Linguistic Atlas of Late Medieval English</emph>’s
                        linguistic profiles for “oure,” “our,” and “oure.” See eLALME's <ref
                        target="http://archive.ling.ed.ac.uk/ihd/elalme_scripts/mapping/user-defined_maps.html"
                        >User Defined Maps</ref> for more information. Unfortunately the current
                        online version does not allow direct linking between static dotmaps and
                        linguistic profiles.</note> best entent</orig>
                </line>
                <line>
                    <orig>our<ex>e</ex> lyf reme<ex>m</ex>bryng froward and vicious</orig>
                </line>
                <line>
                    <orig>ay contrarye to the comaundement</orig>
                </line>
                <line>
                    <orig>of crist ih<ex>es</ex>u now wyth avisement</orig>
                </line>
                <line>
                    <orig>the lord beseching <gap quantity="2" unit="chars" reason="illegible"
                        /><note place="bottom" anchored="true" xml:id="informational">Trapp
                        suggests "of" here, which fits the space in a way that MacCracken's "in
                        thyn" will not, but it does not seem to fit the admittedly paltry
                        remnants of the text. "In" seems the likely word here, but the text is
                        too damaged to definitively state that this is the case.</note>
                        <damage>mercy and pete</damage></orig>
                </line>
                <line>
                    <orig>our<ex>e</ex> youthe <ex>&amp;</ex> age that we have
                        <damage>myspent</damage></orig>
                </line>
                <line>
                    <orig>wyt<damage>h t</damage>h<damage>is woor</damage>d <damage>mercy
                        knelyng</damage> on oure kne<note place="bottom" anchored="true"
                        xml:id="informational">This change occurs only in the Clopton
                        verses.</note></orig>
                </line>
            </zone>
        </surface>

Поскольку это новая часть пространства имен, я не могу использовать стандартные таблицы стилей и написал следующий шаблон для нумерации заметок в отображаемом блоке текста:

<xsl:template match="tei:note">
    <xsl:variable name="num">
        <xsl:number count="tei:note" level="any" from="/tei:TEI/tei:sourceDoc/tei:surfaceGrp/tei:surface"/>
    </xsl:variable>
    <xsl:variable name="panel_name">
        <xsl:value-of select="concat(../../../../@xml:id,$num)"/>
    </xsl:variable>
    <xsl:choose>
        <xsl:when test="@xml:id ='explanatory'">
            <span class="explanatory"><sup><a><xsl:attribute name="href"><xsl:value-of select="concat('#fn',$num)"/></xsl:attribute><xsl:attribute name="id"><xsl:value-of select="$panel_name"/></xsl:attribute><font size="-1"><xsl:value-of select="$num"/></font></a></sup></span>
        </xsl:when>
        <xsl:when test="@xml:id ='informational'">
            <span class="informational"><sup><a><xsl:attribute name="href"><xsl:value-of select="concat('#fn',$num)"/></xsl:attribute><xsl:attribute name="id"><xsl:value-of select="$panel_name"/></xsl:attribute><font size="-1"><xsl:value-of select="$num"/></font></a></sup></span>
        </xsl:when>
        <xsl:otherwise/>
    </xsl:choose>
</xsl:template>

Моя проблема, однако, заключается в следующем наборе шаблонов, который пытается отобразить тело примечаний внизу страницы с соответствующей нумерацией:

        <xsl:template name="makeNotes">
            <xsl:variable name="num" select="count(.//tei:note)"/> 
            <xsl:variable name="panel_name">
                <xsl:value-of select="concat(@xml:id,$num)"/>
            </xsl:variable>

            <div class="notes">
                <div class="noteHeading">Notes</div>

                <xsl:call-template name="loop"> 
                    <xsl:with-param name="i" select="number(1)"/>
                    <xsl:with-param name="max" select="$num"/> 
                </xsl:call-template>
           </div>    
        </xsl:template>
   <xsl:template name="loop"> 
        <!--recursive loop until done--> 
        <xsl:param name="i"/> 
        <xsl:param name="max"/> 

        <xsl:for-each select=".//tei:orig">
            <xsl:if test="tei:note">
                <xsl:if test="$i &lt;= $max"> 
                    <!-- Repeated content Here --> 
                    <!-- use value-of i to get loop index --> 
                    <div class ="note"><span class="noteLabel"><xsl:attribute name="id"><xsl:value-of select="concat('fn',$i)"/></xsl:attribute><xsl:value-of select="$i"></xsl:value-of>.</span><div class="noteBody"><xsl:value-of select="tei:note"/></div></div>
                    <xsl:call-template name="loop"> 
                        <xsl:with-param name="i" select="$i + 1"/> 
                        <xsl:with-param name="max" select="$max"/> 
                    </xsl:call-template> 
                </xsl:if> 
            </xsl:if>
        </xsl:for-each>

Я могу либо отформатировать код для правильного отображения чисел с помощью модификации кода, который я имею в шаблоне tei:note, либо я могу отформатировать код для правильного отображения заметок, что я и имею здесь. Мне нужно иметь возможность правильно отображать как примечание, так и нумерацию, и я понимаю, что причина, по которой это не работает, заключается в том, что tei:note появляется только один раз в иерархии каждой строки. Я знаю, как сделать это на процедурном языке, но так как xsl функционален, я в тупике, и ни один из методов, которые я видел, не предлагал (используя count(), <xsl:number>и т. д.) работа.

Токовый выход у меня выглядит следующим образом:

<div class="note"><span class="noteLabel" id="fn1">1.</span>
    <div class="noteBody">Although "r" on the
      painted panels of the chapel is consistently written with an otiose mark
      when it concludes a word, the mark here is rendered more heavily and
      with a dot indicating suspension above the r. This rendering as "oure"
      is a linguistic outlier for the area based on the electronic Linguistic Atlas of Late Medieval English's
      linguistic profiles for "oure," "our," and "oure." See eLALME's User Defined Maps for more information. Unfortunately the current
      online version does not allow direct linking between static dotmaps and
      linguistic profiles.</div>
  </div>
  <div class="note"><span class="noteLabel" id="fn1">1.</span>
    <div class="noteBody">Trapp
      suggests "of" here, which fits the space in a way that MacCracken's "in
      thyn" will not, but it does not seem to fit the admittedly paltry
      remnants of the text. "In" seems the likely word here, but the text is
      too damaged to definitively state that this is the case.</div>
  </div>
  <div class="note"><span class="noteLabel" id="fn1">1.</span>
    <div class="noteBody">This change occurs only in the Clopton
      verses.</div>
  </div>

То, что мне нужно, чтобы результаты показали следующее:

<div class="note"><span class="noteLabel" id="fn1">1.</span>
    <div class="noteBody">Although "r" on the
      painted panels of the chapel is consistently written with an otiose mark
      when it concludes a word, the mark here is rendered more heavily and
      with a dot indicating suspension above the r. This rendering as "oure"
      is a linguistic outlier for the area based on the electronic Linguistic Atlas of Late Medieval English's
      linguistic profiles for "oure," "our," and "oure." See eLALME's User Defined Maps for more information. Unfortunately the current
      online version does not allow direct linking between static dotmaps and
      linguistic profiles.</div>
  </div>
  <div class="note"><span class="noteLabel" id="fn2">2.</span>
    <div class="noteBody">Trapp
      suggests "of" here, which fits the space in a way that MacCracken's "in
      thyn" will not, but it does not seem to fit the admittedly paltry
      remnants of the text. "In" seems the likely word here, but the text is
      too damaged to definitively state that this is the case.</div>
  </div>
  <div class="note"><span class="noteLabel" id="fn3">3.</span>
    <div class="noteBody">This change occurs only in the Clopton
      verses.</div>
  </div>

1 ответ

Решение

Я думаю, что все, что вам нужно, это некоторый код следующим образом (вам нужно будет адаптировать шаблоны, чтобы они соответствовали элементам в вашем пространстве имен, но, поскольку в вашем примере не показано пространство имен, без которого я работал):

<xsl:stylesheet version="2.0"
        xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:output method="html" indent="yes"/>

<xsl:template match="surface">
  <xsl:apply-templates select=".//orig[note]" mode="list"/>
</xsl:template>

<xsl:template match="orig" mode="list">
<div class ="note"><span class="noteLabel" id="fn{position()}"><xsl:value-of select="position()"></xsl:value-of>.</span><div class="noteBody"><xsl:value-of select="note"/></div></div>
</xsl:template>

</xsl:stylesheet>

Это преобразует входной образец, который вы разместили в результат

<div class="note"><span class="noteLabel" id="fn1">1.</span><div class="noteBody">Although “r” on the
      painted panels of the chapel is consistently written with an otiose mark
      when it concludes a word, the mark here is rendered more heavily and
      with a dot indicating suspension above the r. This rendering as “oure”
      is a linguistic outlier for the area based on the electronic Linguistic Atlas of Late
      Medieval English’s
      linguistic profiles for “oure,” “our,” and “oure.” See eLALME's User Defined Maps
      for more information. Unfortunately the current
      online version does not allow direct linking between static dotmaps and
      linguistic profiles.
   </div>
</div>
<div class="note"><span class="noteLabel" id="fn2">2.</span><div class="noteBody">Trapp
      suggests "of" here, which fits the space in a way that MacCracken's "in
      thyn" will not, but it does not seem to fit the admittedly paltry
      remnants of the text. "In" seems the likely word here, but the text is
      too damaged to definitively state that this is the case.
   </div>
</div>
<div class="note"><span class="noteLabel" id="fn3">3.</span><div class="noteBody">This change occurs only in the Clopton
      verses.
   </div>
</div>

Это мое предложение для части XSLT, если я правильно понимаю вопрос. Поскольку целевой формат выглядит как HTML, я удивляюсь, почему вы не используете упорядоченный список и элементы списка для нумерации элементов.

Другие вопросы по тегам