Как перебрать все между определенным XML-тегом - PullRequest
1 голос
/ 25 октября 2019

В настоящее время я работаю над чем-то с XML и XSLT. Это часть более крупного проекта и часть моей кандидатской диссертации по истории, поэтому любая помощь крайне приветствуется!

Я делаю цифровое издание учебника, и эта книга, естественно, почти всегда содержит страницы рядом друг с другом, которые я хочу отображать рядом друг с другом. (Я буду использовать для этого либо начальную загрузку, либо SemanticUI)

Поэтому я хочу буквально "захватить" все, что следует за элементом <pb/>, пока не достигну следующего элемента <pb/>

Так что япостроил <xsl:template/>, который превращает каждый тей-элемент <pb/> в div с определенным классом. Моя проблема заключается в том, что <div> должен доходить до следующего <pb> элемента.

<xsl:template match="tei:pb">
        <xsl:element name="div">
            <xsl:attribute name="class"> 
                <xsl:text>test;</xsl:text>
            </xsl:attribute>
            <xsl:attribute name="style">
                <xsl:text>text-align:right;</xsl:text>
            </xsl:attribute>
            <xsl:text>[F.</xsl:text>
            <xsl:value-of select="@n"/>
            <xsl:text>]</xsl:text>
        <xsl:element name="hr"/>
    </xsl:element>

Желаемый макет будет похож на следующий HTML (без границ и т. Д.)

<div class="content">
<div class="panel-body">
  <div class="test" style="width: 49%;border:solid 1px red; float:left">
    <div class="page number" style="text-align:right;"> F.29v. <hr>
    </div>
      <div class="text" style="">
        Example text
      </div>
  </div>
<div class="test" style="width:49%;border:solid 1px green;float:left;">
    <div class="page number"style="text-align:right"> F.30r <hr> </div>
      <div class="text" style="">
        Here I want the text to be displayed</div>
</div>

Я не ожидаю, что мой код раньше будет делать то, что я хочу. Код делает, как я думаю, именно то, что он должен делать при написании таким образом, но я хочу, чтобы он привел к выводу моего примера, что я должен изменить? (это всегда 2 <pb> элементов в каждом XML-файле, а не один или три, всегда два.

, поэтому в псевдокоде:

<xsl:template match="tei:pb and all the following elements til the next tei:pb> ```

and then transform it according to my rules

my full stylesheet: 
https://pastebin.com/99CS6n6c

1 Ответ

1 голос
/ 25 октября 2019

Мое предложение будет сводиться к

  <xsl:template match="body">
      <div class="panel-body">
          <xsl:for-each-group select="*" group-starting-with="pb">
                <div class="test" style="width: 49%;border:solid 1px red; float:left">
                    <xsl:apply-templates select="current-group()"/>
                </div>
          </xsl:for-each-group>
       </div>
  </xsl:template>

  <xsl:template match="pb">
      <div class="page number" style="text-align:right;">
          <xsl:text>[F.</xsl:text>
          <xsl:value-of select="@n"/>
          <xsl:text>]</xsl:text>
          <hr/>
      </div>
  </xsl:template>

  <xsl:template match="p">
      <p>
          <xsl:apply-templates/>
      </p>
  </xsl:template>

"Полный пример":

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xpath-default-namespace="http://www.tei-c.org/ns/1.0"
    exclude-result-prefixes="#all"
    version="3.0">

  <xsl:mode on-no-match="shallow-copy"/>

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

  <xsl:template match="/">
    <html>
      <head>
        <title>.NET XSLT Fiddle Example</title>
      </head>
      <body>
        <xsl:apply-templates select="//body"/>
      </body>
    </html>
  </xsl:template>

  <xsl:template match="body">
      <div class="panel-body">
          <xsl:for-each-group select="*" group-starting-with="pb">
                <div class="test" style="width: 49%;border:solid 1px red; float:left">
                    <xsl:apply-templates select="current-group()"/>
                </div>
          </xsl:for-each-group>
       </div>
  </xsl:template>

  <xsl:template match="pb">
      <div class="page number" style="text-align:right;">
          <xsl:text>[F.</xsl:text>
          <xsl:value-of select="@n"/>
          <xsl:text>]</xsl:text>
          <hr/>
      </div>
  </xsl:template>

  <xsl:template match="p">
      <p>
          <xsl:apply-templates/>
      </p>
  </xsl:template>

</xsl:stylesheet>

https://xsltfiddle.liberty -development.net / ncntCSc

Для процессора XSLT 2 вам нужно будет указать <xsl:mode on-no-match="shallow-copy"/> в качестве шаблона идентификации

  <xsl:template match="@* | node()">
    <xsl:copy>
      <xsl:apply-templates select="@* | node()"/>
    </xsl:copy>
  </xsl:template>

С этим кодом преобразуется фрагмент

    <body>
        <pb></pb>
        <p> Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. </p>
        <pb></pb>
        <p>Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. </p>
    </body>

входного сэмплак фрагменту HTML

  <div class="panel-body">
     <div class="test" style="width: 49%;border:solid 1px red; float:left">
        <div class="page number" style="text-align:right;">[F.]
           <hr>
        </div>
        <p> Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor
           invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et
           accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata
           sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing
           elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat,
           sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita
           kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. 
        </p>
     </div>
     <div class="test" style="width: 49%;border:solid 1px red; float:left">
        <div class="page number" style="text-align:right;">[F.]
           <hr>
        </div>
        <p>Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor
           invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et
           accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata
           sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing
           elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat,
           sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita
           kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. 
        </p>
     </div>
  </div>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...