使用 XSLT 格式化 XML 有序列表
Posted
技术标签:
【中文标题】使用 XSLT 格式化 XML 有序列表【英文标题】:Format XML ordered list with XSLT 【发布时间】:2021-10-21 19:41:27 【问题描述】:我有以下 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-片段 ...
<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-Output 来完成呢?
非常感谢您的支持。
问候 诺埃尔
––––––––– 基于评论编辑––––––––––
<?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 必须有某种父级 - 否则它将是一个 XML 片段并且你将无法处理这一切。请发布minimal reproducible example,而不是脱离上下文的代码sn-ps。 查看***.com/tags/xslt-grouping/info 中的group-adjacent
示例。
在xsl:for-each-group select="inlineTag
上使用group-adjacent="@name = 'ol'"
,您应该能够识别inlineTag
元素的相邻序列,其中name
属性为ol
。
@MartinHonnen 非常感谢。我将在答案中发布完整的解决方案。
【参考方案1】:
简化解决方案:
源 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
【讨论】:
以上是关于使用 XSLT 格式化 XML 有序列表的主要内容,如果未能解决你的问题,请参考以下文章