我正在尝试编写一个 xsl 文件,以便将给定的 xml 转换为 html(用于发布)。这是我的示例 xml:
<text xml:lang="grc">
<body>
<div type="edition" n="urn:cts:greekLit:tlg0059.tlg010.perseus-grc2" xml:lang="grc">
<div type="textpart" subtype="section" resp="perseus" n="11">
<p><said who="#Σωκράτης"><milestone unit="page" resp="Stephanus" n="11"/>
<milestone unit="section" resp="Stephanus" n="11a"/><label>ΣΩ.</label> ὅρα δή, Πρώταρχε, τίνα λόγον μέλλεις παρὰ Φιλήβου δέχεσθαι νυνὶ καὶ πρὸς τίνα τὸν παρʼ ἡμῖν ἀμφισβητεῖν,
<milestone unit="section" resp="Stephanus" n="11b"/> ἐὰν μή σοι κατὰ νοῦν ᾖ λεγόμενος. βούλει συγκεφαλαιωσώμεθα ἑκάτερον;</said></p>
<p><said who="#Πρώταρχος"><label>ΠΡΩ.</label> πάνυ μὲν οὖν.</said></p>
<p><said who="#Σωκράτης"><label>ΣΩ.</label> Φίληβος μὲν τοίνυν ἀγαθὸν εἶναί φησι τὸ χαίρειν πᾶσι ζῴοις καὶ τὴν ἡδονὴν καὶ τέρψιν, καὶ ὅσα τοῦ γένους ἐστὶ τούτου σύμφωνα· τὸ δὲ παρʼ ἡμῶν ἀμφισβήτημά ἐστι μὴ ταῦτα, ἀλλὰ τὸ φρονεῖν καὶ τὸ νοεῖν καὶ μεμνῆσθαι καὶ τὰ τούτων αὖ συγγενῆ, δόξαν τε ὀρθὴν καὶ ἀληθεῖς λογισμούς, τῆς γε ἡδονῆς ἀμείνω καὶ λῴω γίγνεσθαι σύμπασιν ὅσαπερ
<milestone unit="section" resp="Stephanus" n="11c"/> αὐτῶν δυνατὰ μεταλαβεῖν· δυνατοῖς δὲ μετασχεῖν ὠφελιμώτατον ἁπάντων εἶναι πᾶσι τοῖς οὖσί τε καὶ ἐσομένοις. μῶν οὐχ οὕτω πως λέγομεν, ὦ Φίληβε, ἑκάτεροι;</said></p>
<p><said who="#Φίληβος"><label>ΦΙ.</label> πάντων μὲν οὖν μάλιστα, ὦ Σώκρατες.</said></p>
<p><said who="#Σωκράτης"><label>ΣΩ.</label> δέχῃ δὴ τοῦτον τὸν νῦν διδόμενον, ὦ Πρώταρχε, λόγον;</said></p>
<p><said who="#Πρώταρχος"><label>ΠΡΩ.</label> ἀνάγκη δέχεσθαι· Φίληβος γὰρ ἡμῖν ὁ καλὸς ἀπείρηκεν.</said></p>
<p><said who="#Σωκράτης"><label>ΣΩ.</label> δεῖ δὴ περὶ αὐτῶν τρόπῳ παντὶ τἀληθές πῃ περανθῆναι;</said></p>
<p><said who="#Πρώταρχος"><milestone unit="section" resp="Stephanus" n="11d"/><label>ΠΡΩ.</label> δεῖ γὰρ οὖν.</said></p>
<p><said who="#Σωκράτης"><label>ΣΩ.</label> ἴθι δή, πρὸς τούτοις διομολογησώμεθα καὶ τόδε.</said></p>
<p><said who="#Πρώταρχος"><label>ΠΡΩ.</label> τὸ ποῖον;</said></p>
<p><said who="#Σωκράτης"><label>ΣΩ.</label> ὡς νῦν ἡμῶν ἑκάτερος ἕξιν ψυχῆς καὶ διάθεσιν ἀποφαίνειν τινὰ ἐπιχειρήσει τὴν δυναμένην ἀνθρώποις πᾶσι τὸν βίον εὐδαίμονα παρέχειν. ἆρʼ οὐχ οὕτως;</said></p>
<p><said who="#Πρώταρχος"><label>ΠΡΩ.</label> οὕτω μὲν οὖν.</said></p>
<p><said who="#Σωκράτης"><label>ΣΩ.</label> οὐκοῦν ὑμεῖς μὲν τὴν τοῦ χαίρειν, ἡμεῖς δʼ αὖ τὴν τοῦ φρονεῖν;</said></p>
<p><said who="#Πρώταρχος"><label>ΠΡΩ.</label> ἔστι ταῦτα.</said></p>
我想以粗体突出显示标签,并且理想情况下,将里程碑部分(如 11b)放置在文本的左边距(但我不知道如何开始执行后一项任务)。
这是我写的xsl:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns="http://www.w3.org/1999/HTML" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" encoding="UTF-8" indent="yes"/>
<xsl:template match="/">
<xsl:apply-templates/>
</xsl:template>
<xsl:template match="label">
<b>
<xsl:apply-templates/>
</b>
</xsl:template>
<xsl:template match="p">
<p>
<xsl:apply-templates/>
</p>
</xsl:template>
</xsl:stylesheet>
但输出是纯文本,没有中断,也没有粗体。任何提示将不胜感激!
您的 XSLT 文件几乎已步入正轨,但它有几个问题需要解决,以实现具有粗体标签和里程碑的所需 HTML 格式。以下是您可以进行的调整和添加:
您的 XML 没有特定的命名空间,但 XSLT 文件引用了 HTML 命名空间。删除或修改它以确保 XSLT 正确匹配 XML 中的元素。
milestone
元素要将
milestone
元素放置在左边距中,您可以为 milestone
创建特定模板。一种简单的方法是在 <span>
元素内设置它们的样式,并使用 CSS 将它们定位在边距中。
为了确保 HTML 输出看起来正确,请为
said
、label
和 milestone
等元素指定其他样式和模板。
这是经过这些更改的修订版 XSLT:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" encoding="UTF-8" indent="yes"/>
<xsl:template match="/">
<html>
<head>
<title>Transformed Text</title>
<style>
/* Style for labels in bold */
.label {
font-weight: bold;
}
/* Style for milestones on the left margin */
.milestone {
float: left;
margin-right: 10px;
color: gray;
}
/* Styling paragraphs */
p {
margin-left: 20px;
text-indent: -20px;
}
</style>
</head>
<body>
<xsl:apply-templates/>
</body>
</html>
</xsl:template>
<!-- Template for paragraphs -->
<xsl:template match="p">
<p>
<xsl:apply-templates/>
</p>
</xsl:template>
<!-- Template for labels with bold formatting -->
<xsl:template match="label">
<span class="label">
<xsl:apply-templates/>
</span>
</xsl:template>
<!-- Template for milestone elements to place them on the left -->
<xsl:template match="milestone">
<span class="milestone">
<xsl:value-of select="@n"/>
</span>
</xsl:template>
<!-- Template for 'said' elements -->
<xsl:template match="said">
<div>
<xsl:apply-templates/>
</div>
</xsl:template>
</xsl:stylesheet>
xmlns="http://www.w3.org/1999/HTML"
,因为它会干扰选择 XML 元素。<style>
块中的 CSS 用于:
.label
类的粗体标签。milestone
类将 .milestone
元素浮动到左边距。<milestone>
元素包裹在<span class="milestone">
中,@n
用于显示里程碑编号。<label>
元素包裹在 <span class="label">
中以实现大胆的样式。这应该创建一个组织更加直观的 HTML 输出,并在左边距中带有粗体标签和里程碑。