使用 XSLT 格式化 XML 有序列表

Format XML ordered list with XSLT

我有以下 XML-片段

<inlineTag name="ol">Point one<break type="paragraph" /></inlineTag>
<inlineTag name="ol">Point two<break type="paragraph" /></inlineTag>
<inlineTag name="ol">Point three<break type="paragraph" /></inlineTag>

…还有我的 XSLT-Snippet

<xsl:when test="./@name='ol'">
   <ol class="imported">
      <li>
         <xsl:value-of select="normalize-space(.)"/>
      </li>
   </ol>
</xsl:when>

… 这显然会导致…

<ol class="imported">
   <li>Point one</li>
</ol>
<ol class="imported">
   <li>Point two</li>
</ol>
<ol class="imported">
   <li>Point three</li>
</ol>

…其中的输出将导致…

1. Point one
1. Point two
1. Point three

…我尝试完成的输出是…

<ol class="imported">
   <li>Point one</li>
   <li>Point two</li>
   <li>Point three</li>
</ol>
 1. Point one
 2. Point two
 3. Point three

…如果 xml 有某种父级会更容易,但是我如何使用当前的 XML-输出来完成此操作?

非常感谢您的支持

问候 诺尔

––––––––– 根据评论进行编辑––––––––

<?xml version="1.0" encoding="UTF-8"?>
<k4Export xmlns="http://www.vjoon.com/K4Export/2.6"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" format="intermediate" version="2.6" xsi:schemaLocation="http://www.vjoon.com/K4Export/2.6 K4Export_2_6.xsd">
    <publication>
        <id>1623922730691</id>
        <name>Digital First</name>
        <displayName>Digital First Topix</displayName>
        <origin>Standalone XMLExporter Sample Configuration</origin>
        <issue>
            <article>
                <attachment>
                        <text>
                            <inlineTag name="Textabschnitt">
                                <inlineTag name="h3">Bedeutung<break type="paragraph" />
                                </inlineTag>
                                <inlineTag name="p">Descartes gilt als der Begründer des modernen frühneuzeitlichen Rationalismus, den Baruch de Spinoza, Nicolas Malebranche und Gottfried Wilhelm Leibniz kritisch-konstruktiv weitergeführt haben. Sein rationalistisches Denken wird auch Cartesianismus genannt. Von ihm stammt das berühmte Dictum «cogito ergo sum» («Ich denke, also bin ich.»), welches die Grundlage seiner Metaphysik bildet, aber auch das Selbstbewusstsein als genuin philosophisches Thema eingeführt hat. Die Annahme, dass die denkende Seele der Ursprung der Erkenntnis sei, hat drei Implikationen: Erstens ist die Quelle aller Erkenntnis nicht mehr im Aufspüren der Gedanken Gottes zu suchen; zweitens macht das denkende Ich den Leib zu einem Objekt der Körperwelt wie andere auch (Leib-Seele-Dualismus); drittens gelten im Bereich der Körper Gesetze der Bewegung, die von keinem Eingriff der Seele in das Geschehen durchbrochen wird (mechanistisches Weltbild). Offen bleiben jedoch die Fragen, wie die Welt der Körper über die Sinnesorgane auf das denkende Ich wirkt und wie der Wille auf die Körperwelt einwirken kann (nach Descartes kann er allenfalls die Richtung der Bewegung der Körper verändern, deren Impuls jedoch gleich bleibt).<break type="paragraph" />
                                </inlineTag>
                                <inlineTag name="p">
                                    <break type="paragraph" />
                                </inlineTag>
                                <inlineTag name="p">Descartes’ Auffassung bezüglich der Existenz zweier beim Menschen miteinander wechselwirkender, voneinander verschiedener «Substanzen» – Geist und Materie – ist heute als cartesianischer Dualismus bekannt und steht im Gegensatz zu den verschiedenen Varianten des Monismus sowie zur dualistischen Naturphilosophie Isaac Newtons, der die Wechselwirkung aktiver immaterieller «Kräfte der Natur» mit der absolut passiven Materie lehrt (siehe dazu Newtonsche Gesetze, Erstes Gesetz der Bewegung).<break type="paragraph" />
                                </inlineTag>
                                <inlineTag name="p">
                                    <break type="paragraph" />
                                </inlineTag>
                                <inlineTag name="p">Descartes ist der Begründer der analytischen Geometrie, welche Algebra und Geometrie verbindet. Seine naturwissenschaftlichen Arbeiten – seine Ablehnung des Gravitationsprinzips oder seine Wirbeltheorie – sind zwar früh durch die Newtonsche Physik widerlegt worden;sie sind jedoch nicht gering zu schätzen, da Descartes einer der wichtigsten und strengsten Vertreter des Mechanizismus war, der die ältere aristotelische Physik abgelöst hat.<break type="paragraph" />
                                </inlineTag>
                                <inlineTag name="p">
                                    <break type="paragraph" />
                                </inlineTag>
                                <inlineTag name="p">Sein Ethos der Pflicht und der Selbstüberwindung hat die Literatur der französischen Klassik des 17. Jahrhunderts, insbesondere Pierre Corneille, Nicolas Boileau, Jacques Bénigne Bossuet und Jean de La Bruyère, beeinflusst.<break type="paragraph" />
                                </inlineTag>
                                <inlineTag name="p">
                                    <break type="paragraph" />
                                </inlineTag>
                                <inlineTag name="h3">Leben<break type="paragraph" />
                                </inlineTag>
                                <inlineTag name="p">Descartes wurde als drittes Kind einer kleinadeligen Familie der Touraine geboren. Sein Vater, Joachim Descartes (1563–1640), war Gerichtsrat (Conseiller) am Obersten Gerichtshof der Bretagne in Rennes. Seine Mutter, Jeanne Brochard, starb am 16. Mai 1597 nach der Geburt ihres letzten Kindes, das nicht überlebte. Da der Vater rasch wieder heiratete, verbrachte Descartes seine Kindheit bei seiner Großmutter mütterlicherseits und einer Amme, die ihn erzog und überlebte und die er liebevoll in seinem Testament bedachte (siehe Adrien Baillet, La Vie de Monsieur Descartes, 2 vol. 1691). Mit acht Jahren kam er als Internatsschüler auf das jesuitische Collège Henri-IV de La Flèche, das er acht Jahre später mit einer klassischen sowie mathematischen Ausbildung verließ.<break type="paragraph" />
                                </inlineTag>
                                <inlineTag name="p">
                                    <break type="paragraph" />
                                </inlineTag>
                                <inlineTag name="blockquote">«Zweifel ist der Weisheit Anfang.»<break type="paragraph" />
                            </inlineTag>
                            <inlineTag name="blockquote">
                                <break type="paragraph" />
                            </inlineTag>
                            <inlineTag name="h3">Zeit der Reife und der philosophischen Werke<break type="paragraph" />
                            </inlineTag>
                            <inlineTag name="p">Während seiner ersten Zeit in den Niederlanden arbeitete Descartes an einem Traktat zur Metaphysik, in dem er einen klaren und zwingenden Gottesbeweis zu führen hoffte. Er legte ihn jedoch beiseite zugunsten eines großangelegten naturwissenschaftlichen Werks, das in französischer Sprache verfasst werden sollte und nicht mehr, wie seine bisherigen Texte, in Latein. Diesen Traité du Monde «(Abhandlung über die Welt)», wie er heißen sollte, ließ er jedoch unvollendet, als er vom Schicksal Galileo Galileis erfuhr, der 1633 von der Inquisition zum Widerruf seiner die Forschungen von Nicolaus Copernicus und Johannes Kepler bestätigenden Theorien gezwungen worden war. 1637 publizierte Descartes im holländischen Leiden anonym seinen Discours de la méthode pour bien conduire sa raison et chercher la vérité dans les sciences, plus la Dioptrique, les Météores et la Géométrie qui sont des essais de cette méthode (deutscher Titel: Abhandlung über die Methode des richtigen Vernunftgebrauchs und der wissenschaftlichen Wahrheitsforschung), wörtlich: «Abhandlung über die Methode, seine Vernunft gut zu gebrauchen und die Wahrheit in den Wissenschaften zu suchen, dazu die Lichtbrechung, die Meteore und die Geometrie als Versuchsanwendungen dieser Methode». Der als populärwissenschaftliches Werk auf hohem Niveau angelegte Discours de la méthode, wurde langfristig Descartes’ wirksamstes Buch.<break type="paragraph" />
                            </inlineTag>
                            <inlineTag name="p">
                                <break type="paragraph" />
                            </inlineTag>
                            <inlineTag name="h4">Kernpunkte des Discours sind:<break type="paragraph" />
                            </inlineTag>
                            <inlineTag name="p">
                                <break type="paragraph" />
                            </inlineTag>
                            <inlineTag name="ul">eine Erkenntnistheorie, die nur das als richtig akzeptiert, was durch die eigene schrittweise Analyse und logische Reflexion als plausibel verifiziert wird,<break type="paragraph" />
                            </inlineTag>
                            <inlineTag name="ul">eine Ethik, gemäß der das Individuum sich im Sinne bewährter gesellschaftlicher Konventionen pflichtbewusst und moralisch zu verhalten hat,<break type="paragraph" />
                            </inlineTag>
                            <inlineTag name="ul">eine Metaphysik, die zwar (durch logischen Beweis) die Existenz eines vollkommenen Schöpfer-Gottes annimmt, aber kirchenartigen Institutionen wenig Raum lässt,<break type="paragraph" />
                            </inlineTag>
                            <inlineTag name="ul">eine Physik, die die Natur als durch zwar gottgegebene, aber allgemein gültige Gesetze geregelt betrachtet und dem Menschen ihre rationale Erklärung und damit letztlich ihre Beherrschung zur Aufgabe macht.<break type="paragraph" />
                            </inlineTag>
                            <inlineTag name="p">
                                <break type="paragraph" />
                            </inlineTag>
                            <inlineTag name="p">Auch die nächsten Werke von Descartes lösten in Fachkreisen intensive Diskussion aus und waren langfristig wirksam:<break type="paragraph" />
                            </inlineTag>
                            <inlineTag name="p">
                                <break type="paragraph" />
                            </inlineTag>
                            <inlineTag name="ol">zunächst lateinisch gedruckt wurden 1641 in Paris die Méditations sur la philosophie première, dans laquelle sont démontrées l’existence de Dieu et l’immortalité de l’âme (so der Titel einer französischen Übersetzung von 1647; deutsch «Meditationen über die Erste Philosophie, in der die Existenz Gottes und die Unsterblichkeit der Seele bewiesen wird»). Die zweite Auflage 1642 in Amsterdam erschien mit geändertem Untertitel, «denn ich kann nicht beweisen, dass Gott die Seele nicht vernichten könnte, sondern nur, dass sie von völlig anderer Natur als der Körper ist und nicht mit dem Körper stirbt» (Brief an Marin Mersenne vom 24. Dezember 1640). Der Untertitel lautete nun: Méditations sur la philosophie première, dans laquelle sont démontrées l’existence de Dieu et la distinction de l’âme et du corps (deutsch «Meditationen über die Erste Philosophie, in der die Existenz Gottes und der Unterschied zwischen Seele und Körper bewiesen wird»).<break type="paragraph" />
                            </inlineTag>
                            <inlineTag name="ol">Ebenfalls erst nachträglich ins Französische übersetzt wurde die Schrift Principia philosophiae («Grundlagen der Philosophie», 1644).</inlineTag>
                        </inlineTag>
                    </text>
            </attachment>
        </article>
    </issue>
</publication>
</k4Export>

简化的解决方案:

来源XML-文件:

<?xml version="1.0" encoding="UTF-8"?>
<text>
    <inlineTag name="ol">Point one</inlineTag>
    <inlineTag name="ol">Point two</inlineTag>
    <inlineTag name="ol">Point three</inlineTag>
</text>

XSLT 转换:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
<xsl:output method="html" indent="yes" doctype-system="about:legacy-doctype"/>
<xsl:template match="/text">
    <xsl:copy>
        <xsl:apply-templates select="@*" />
        <xsl:for-each-group select="*" group-adjacent="@name = 'ol'">   
            <xsl:choose>
                <xsl:when test="current-grouping-key()">
                    <ol>
                        <xsl:apply-templates select="current-group()"/> 
                    </ol>
                </xsl:when>
            </xsl:choose>
        </xsl:for-each-group>
    </xsl:copy>
</xsl:template>
    <xsl:template match="inlineTag">
        <xsl:choose>
            <xsl:when test="./@name='ol'">
                <li class="imported"><xsl:apply-templates/></li>    
            </xsl:when>
        </xsl:choose>
    </xsl:template>
</xsl:stylesheet>

HTML-输出:

<!DOCTYPE html
  SYSTEM "about:legacy-doctype">
<text>
   <ol>
      <li class="imported">Point one</li>
      <li class="imported">Point two</li>
      <li class="imported">Point three</li>
   </ol>
</text>

HTML-输出-结果:

1. Point one
2. Point two
3. Point three