Добавление вставки в ‹div class=file-wrapper clearfix› приводит к тому, что ‹div id=ds-options-wrapper› вкладывается в ‹div id=ds-body›

Когда я вставляю фрагмент JavaScript для встраивания в конец контейнера <div class="file-wrapper clearfix"></div> в item-view.xsl темы Mirage, по какой-то причине <div id="ds-options-wrapper"></div>, найденный в page-navigation.xsl, генерируется за пределами <div id="ds-body"></div>.

Я написал дополнительный XSL в <div class="file-wrapper clearfix"></div>, чтобы включить вставку JavaScript только тогда, когда элемент имеет DOI, доступный в mets.xml. Всякий раз, когда DOI доступен, встраивание появляется, но приводит к тому, что <div id="ds-options-wrapper"></div> становится дочерним элементом <div id="ds-body"></div>, а не братом, как должно быть. Всякий раз, когда нет встраивания, <div id="ds-options-wrapper"></div> является братом и непосредственно следует за <div id="ds-body"></div>, как в шаблоне Mirage по умолчанию.

Почему это происходит? Я бы хотел, чтобы <div id="ds-options-wrapper"></div> остался братом или сестрой <div id="ds-body"></div>

Вот примерный план того, как выглядит сгенерированный DOM с встраиванием и без него:

С встраиванием (псевдокод)

<!-- id=" and class=" omitted -->
<div ds-content>
     <div ds-body>
          <div aspect_..._div_item-view>
               <div item-summary-view-metadata>
               </div>
               <div file-list>
                    <div file-wrapper clearfix>
                          thumbnail-wrapper
                          file metadata
                          <!-- EMBED APPEARS HERE -->
                          <div embed> </div>
                    </div>
                    <div item-summary-view-metadata>
                         URI
                         Date
                         etc...
                    </div>
                    <h2> appears in... </h2>
                    <ul> referenceSet-list </ul>
               </div>
          </div>
          <!-- ds-options-wrapper nested WITHIN ds-body for some reason -->
          <div ds-options-wrapper>
               .....
          </div>
     </div>
</div>

Без встраивания

<!-- id=" and class=" omitted -->
<div ds-content>
     <div ds-body>
          <div aspect_..._div_item-view>
               <div item-summary-view-metadata>
               </div>
               <div file-list>
                    <div file-wrapper clearfix>
                          thumbnail-wrapper
                          file metadata
                          <!-- NO EMBED HERE -->
                    </div>
               </div> <!-- file-list ends here ?? -->
               <div item-summary-view-metadata>
                         URI
                         Date
                         etc...
               </div>
               <h2> appears in... </h2>
               <ul referenceSet-list> </ul>
          </div>
     </div>
     <!-- ds-options-wrapper nested OUTSIDE ds-body like normal -->
     <div ds-options-wrapper>
          .....
     </div>
</div>

Хотя кажется, что это не имеет значения,

вот код, который я вставил в item-view.xsl

<xsl:template match="mets:file">
        <xsl:param name="context" select="."/>
        <div class="file-wrapper clearfix">
            <div class="thumbnail-wrapper">
                ....
            </div>
            <div class="file-metadata">
                ....
            </div>
            <!-- INSERTED CODE TO GENERATE JS EMBED HERE -->
            <!-- Only output is either .... -->
            <xsl:variable name="quoteChar">"</xsl:variable>
            <xsl:choose>
                <xsl:when test="//dim:field[@element='identifier'][@qualifier='doi']">
                    <xsl:variable name="doiVar" select="//dim:field[@element='identifier'][@qualifier='doi']"></xsl:variable>
                    <!-- HERE -->
                    <div data-badge-type='medium-donut' class='altmetric-embed' data-badge-details='right' data-doi='{$doiVar}'></div>
                </xsl:when>
                <xsl:otherwise>
                    <xsl:if test="contains(//dim:field[@element='identifier'][@qualifier='citation'],'doi')">
                        <xsl:variable name="parseThis" select="//dim:field[@element='identifier'][@qualifier='citation']"></xsl:variable>

                        <xsl:variable name="tokenized" select="str:split($parseThis, 'doi:')" />
                        <xsl:for-each select="$tokenized">
                            <xsl:variable name="curtoken" select="."/>
                            <xsl:if test="contains($curtoken, '10.') and contains($curtoken, '/')">
                                <xsl:variable name="newtext">
                                    <xsl:call-template name="string-trim">
                                        <xsl:with-param name="string" select="$curtoken" />
                                    </xsl:call-template>
                                </xsl:variable>
                                <!-- OR HERE -->
                                <div data-badge-type='medium-donut' class='altmetric-embed' data-badge-details='right' data-doi='{$newtext}'></div>
                            </xsl:if>
                        </xsl:for-each>
                    </xsl:if>
                </xsl:otherwise>
            </xsl:choose>
            <!-- End Code -->

         </div> <!-- end .file-wrapper clearfix-->
</xsl:template>

Обратите внимание, что если встраивание существует, то по какой-то причине <div class="file-list> также будет инкапсулировать узлы, содержащие URI, дату и т. д., но этого не происходит, если встраивания нет.

Что делает параметр context? Я вижу, что он вызывается из шаблона, генерирующего <div class="file-list">. На самом деле у меня нет четкого представления о том, что происходит внутри этого шаблона:

<div class="file-list">
            <xsl:choose>
                <xsl:when test="...">
                      ... 
                      <!-- what goes on here? -->
                </xsl:when>
                <xsl:otherwise>
                    <xsl:apply-templates select="mets:file">
                        <!-- what goes on here? -->
                        <xsl:with-param name="context" select="$context"/>
                    </xsl:apply-templates>
                </xsl:otherwise>
            </xsl:choose>
        </div>

person LazerSharks    schedule 01.09.2014    source источник


Ответы (1)


Проблема в пустых элементах div. Известно, что пустые элементы XHTML нарушают структуру XHTML в старых темах DSpace. Вы можете исправить это, добавив неразрывный пробел в div:

<div data-badge-type='medium-donut' class='altmetric-embed' data-badge-details='right' data-doi='{$doiVar}'>&#160;</div>

Если вы ищете   в коде Mirage, вы увидите довольно много вхождений.

Эта проблема решена в Mirage 2.

person Bavo Van Geit    schedule 02.09.2014
comment
Большое спасибо. Наконец-то добрались до тестирования, и это действительно решение. - person LazerSharks; 05.09.2014