使用 XSLT 为 XML 到 HTML 转换中的不同 <place> 标签添加超链接
Add hyperlinks for different <place> tags in XML to HTML transformation with XSLT
我有一组 XML 文件,其中地名(在不同的历史拼写中)被标记为
<place>
:比照。 sample file。地方标签还包含属性 link
,其值是指向世界历史地名词典页面的超链接,例如:
<place name="Wien" type="place_of_issue"
link="http://whgazetteer.org/places/12346175/portal">Wien</place>
使用 XSLT 将 XML 文件转换为 HTML,我希望文本中的每个此类标记都被超链接 <a href>
替换,链接到同一个 WHG URL.
基于 Michael Hor-257k 的回答,我的 XSL 的最小版本是:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="html"/>
<xsl:template match="/">
<!-- Jekyll statement -->
---
<xsl:for-each select="source/metadata/digital_surrogate">
layout: page
title: <xsl:value-of select="@filename"/>
permalink: /<xsl:value-of select="@filename"/>/
exclude: true
---
</xsl:for-each>
<!-- Get transcription with links -->
<div class="flex-container">
<div><p><strong>Transkription:</strong></p>
<p><xsl:apply-templates select="//div">
</xsl:apply-templates>
<!-- include WHG links -->
<xsl:for-each select="//place">
<p>Genannte Orte im World Historical Gazetteer:</p>
<a href="{//place/@link}" target="_blank">
<xsl:value-of select="."/>
</a><br/>
</xsl:for-each>
</p><br/>
</div>
</div>
</xsl:template>
</xsl:stylesheet>
这至少可以正确显示所有以正确顺序提及的地名,以及正确的 WHG 链接和正确的名称:
<a href="http://whgazetteer.org/places/12346175/portal" target="_blank">Wien</a>
<a href="http://whgazetteer.org/places/13067462/portal" target="_blank">Maintz</a>
<a href="http://whgazetteer.org/places/12346175/portal" target="_blank">Wien</a>
但是,链接仍然显示在转录下方,而不是在转录内。
我想要的 HTML 输出是:
<div class="flex-container">
<div>
<p><strong>Transkription:</strong></p>
<p>
Wir Vorsteher und gesamte
Meister des ehrsamen Handwerks der bürgerl:[ichen] Tischlern in der K:[aiserlich]
K:[öniglichen] Haubt = und Residenz Stadt <a href="http://whgazetteer.org/places/12346175/portal" target="_blank">Wien</a> (beglaubigen) hiermit,
daß gegenwertiger Tischlergesell, Namens Georg
Gramer von <a href="http://whgazetteer.org/places/13067462/portal" target="_blank">Maintz</a> - -
[etc.]
</p>
</div>
</div>
我猜不是:
<xsl:variable name="urlPlace">
<xsl:value-of select="@link"/>
</xsl:variable>
<a href="{$urlPlace}" target="_blank"><xsl:apply-templates select="//place"/></a>
你想做的事情:
<a href="{@link}" target="_blank">
<xsl:value-of select="."/>
</a>
未测试,因为没有提供测试示例。
---添加---
看看你是否可以以此为起点:
XSLT 1.0
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html"/>
<xsl:template match="/source">
<html>
<body>
<xsl:apply-templates select="content/body/div"/>
</body>
</html>
</xsl:template>
<xsl:template match="div">
<p>
<xsl:apply-templates select="text"/>
</p>
</xsl:template>
<xsl:template match="place">
<a href="{@link}" target="_blank">
<xsl:value-of select="."/>
</a>
</xsl:template>
</xsl:stylesheet>
要理解这一点并使其适应您的需要,您需要研究 XSLT 的处理模型:https://www.w3.org/TR/1999/REC-xslt-19991116/#section-Processing-Model
如果您想将 <place name="Wien" type="place_of_issue" link="http://whgazetteer.org/places/12346175/portal">Wien</place>
等位置元素转换为 HTML a
元素,请使用模板
<xsl:template match="place">
<a href="{@link}">
<xsl:value-of select="."/>
</a>
</xsl:template>
为其他元素(如 place
的祖先)的转换编写模板,并确保这些模板处理具有 <xsl:apply-templates/>
.
的子节点
这样输入的结构和顺序应该被保留,只是输出中有 HTML 反映了输入中的语义 XML 元素。
前两个答案帮助我理解了我不熟悉的 XSL 中的嵌套规则。
所以这是完全符合我要求的完整 XSL:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="html"/>
<!-- BESCHREIBUNG, BILD UND TEXT AUF "SOURCE" EBENE -->
<xsl:template match="source">
<!-- Jekyll statement --> --- <xsl:for-each select="metadata/digital_surrogate">
layout: page title: <xsl:value-of select="@filename"/> permalink: /<xsl:value-of
select="@filename"/>/ exclude: true --- </xsl:for-each>
<!-- Metadaten -->
<xsl:for-each select="metadata/source_description">
<h3>Ausstellungsort: <xsl:value-of select="@place"/></h3>
<h3>Ausstellungsdatum: <xsl:value-of select="@date"/></h3>
</xsl:for-each>
<xsl:for-each select="edition">
<h4 align="center">ediert von: <xsl:value-of select="editors/@name"/></h4>
<h4 align="center">zuletzt bearbeitet: <xsl:value-of
select="transcription_info/@last_revision_date"/></h4>
</xsl:for-each>
<br/>
<xsl:for-each select="metadata/digital_surrogate">
<xsl:variable name="urlVar">
<xsl:value-of select="@URL"/>
</xsl:variable>
<img src="{$urlVar}" valign="top"/>
</xsl:for-each>
<!-- HTML-Flex-Container für Digitalisat und Inhalt -->
<div class="flex-container">
<div>
<p>
<strong>Graphische Elemente:</strong>
</p>
<p>
Art des Siegels: <xsl:value-of select="metadata/source_description/@seal"/>
Sonstiges: <xsl:for-each select="visual_element"/>
</p>
<br/>
</div>
</div>
<hr/>
<div class="flex-container">
<div>
<p>
<strong>Transkription:</strong>
</p>
<p>
<xsl:apply-templates select="content/body/div"/>
</p>
</div>
<div>
<p>
<strong>Übersetzung:</strong>
</p>
<p>
<xsl:apply-templates select="translation"/>
</p>
<br/>
</div>
</div>
</xsl:template>
<!-- WHG LINKS AUF EBENE DIV UND TEXT -->
<xsl:template match="div">
<p>
<xsl:apply-templates select="text"/>
</p>
</xsl:template>
<xsl:template match="place">
<a href="{@link}" target="_blank">
<xsl:value-of select="."/>
</a>
</xsl:template>
</xsl:stylesheet>
我有一组 XML 文件,其中地名(在不同的历史拼写中)被标记为
<place>
:比照。 sample file。地方标签还包含属性 link
,其值是指向世界历史地名词典页面的超链接,例如:
<place name="Wien" type="place_of_issue"
link="http://whgazetteer.org/places/12346175/portal">Wien</place>
使用 XSLT 将 XML 文件转换为 HTML,我希望文本中的每个此类标记都被超链接 <a href>
替换,链接到同一个 WHG URL.
基于 Michael Hor-257k 的回答,我的 XSL 的最小版本是:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="html"/>
<xsl:template match="/">
<!-- Jekyll statement -->
---
<xsl:for-each select="source/metadata/digital_surrogate">
layout: page
title: <xsl:value-of select="@filename"/>
permalink: /<xsl:value-of select="@filename"/>/
exclude: true
---
</xsl:for-each>
<!-- Get transcription with links -->
<div class="flex-container">
<div><p><strong>Transkription:</strong></p>
<p><xsl:apply-templates select="//div">
</xsl:apply-templates>
<!-- include WHG links -->
<xsl:for-each select="//place">
<p>Genannte Orte im World Historical Gazetteer:</p>
<a href="{//place/@link}" target="_blank">
<xsl:value-of select="."/>
</a><br/>
</xsl:for-each>
</p><br/>
</div>
</div>
</xsl:template>
</xsl:stylesheet>
这至少可以正确显示所有以正确顺序提及的地名,以及正确的 WHG 链接和正确的名称:
<a href="http://whgazetteer.org/places/12346175/portal" target="_blank">Wien</a>
<a href="http://whgazetteer.org/places/13067462/portal" target="_blank">Maintz</a>
<a href="http://whgazetteer.org/places/12346175/portal" target="_blank">Wien</a>
但是,链接仍然显示在转录下方,而不是在转录内。
我想要的 HTML 输出是:
<div class="flex-container">
<div>
<p><strong>Transkription:</strong></p>
<p>
Wir Vorsteher und gesamte
Meister des ehrsamen Handwerks der bürgerl:[ichen] Tischlern in der K:[aiserlich]
K:[öniglichen] Haubt = und Residenz Stadt <a href="http://whgazetteer.org/places/12346175/portal" target="_blank">Wien</a> (beglaubigen) hiermit,
daß gegenwertiger Tischlergesell, Namens Georg
Gramer von <a href="http://whgazetteer.org/places/13067462/portal" target="_blank">Maintz</a> - -
[etc.]
</p>
</div>
</div>
我猜不是:
<xsl:variable name="urlPlace">
<xsl:value-of select="@link"/>
</xsl:variable>
<a href="{$urlPlace}" target="_blank"><xsl:apply-templates select="//place"/></a>
你想做的事情:
<a href="{@link}" target="_blank">
<xsl:value-of select="."/>
</a>
未测试,因为没有提供测试示例。
---添加---
看看你是否可以以此为起点:
XSLT 1.0
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html"/>
<xsl:template match="/source">
<html>
<body>
<xsl:apply-templates select="content/body/div"/>
</body>
</html>
</xsl:template>
<xsl:template match="div">
<p>
<xsl:apply-templates select="text"/>
</p>
</xsl:template>
<xsl:template match="place">
<a href="{@link}" target="_blank">
<xsl:value-of select="."/>
</a>
</xsl:template>
</xsl:stylesheet>
要理解这一点并使其适应您的需要,您需要研究 XSLT 的处理模型:https://www.w3.org/TR/1999/REC-xslt-19991116/#section-Processing-Model
如果您想将 <place name="Wien" type="place_of_issue" link="http://whgazetteer.org/places/12346175/portal">Wien</place>
等位置元素转换为 HTML a
元素,请使用模板
<xsl:template match="place">
<a href="{@link}">
<xsl:value-of select="."/>
</a>
</xsl:template>
为其他元素(如 place
的祖先)的转换编写模板,并确保这些模板处理具有 <xsl:apply-templates/>
.
这样输入的结构和顺序应该被保留,只是输出中有 HTML 反映了输入中的语义 XML 元素。
前两个答案帮助我理解了我不熟悉的 XSL 中的嵌套规则。
所以这是完全符合我要求的完整 XSL:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="html"/>
<!-- BESCHREIBUNG, BILD UND TEXT AUF "SOURCE" EBENE -->
<xsl:template match="source">
<!-- Jekyll statement --> --- <xsl:for-each select="metadata/digital_surrogate">
layout: page title: <xsl:value-of select="@filename"/> permalink: /<xsl:value-of
select="@filename"/>/ exclude: true --- </xsl:for-each>
<!-- Metadaten -->
<xsl:for-each select="metadata/source_description">
<h3>Ausstellungsort: <xsl:value-of select="@place"/></h3>
<h3>Ausstellungsdatum: <xsl:value-of select="@date"/></h3>
</xsl:for-each>
<xsl:for-each select="edition">
<h4 align="center">ediert von: <xsl:value-of select="editors/@name"/></h4>
<h4 align="center">zuletzt bearbeitet: <xsl:value-of
select="transcription_info/@last_revision_date"/></h4>
</xsl:for-each>
<br/>
<xsl:for-each select="metadata/digital_surrogate">
<xsl:variable name="urlVar">
<xsl:value-of select="@URL"/>
</xsl:variable>
<img src="{$urlVar}" valign="top"/>
</xsl:for-each>
<!-- HTML-Flex-Container für Digitalisat und Inhalt -->
<div class="flex-container">
<div>
<p>
<strong>Graphische Elemente:</strong>
</p>
<p>
Art des Siegels: <xsl:value-of select="metadata/source_description/@seal"/>
Sonstiges: <xsl:for-each select="visual_element"/>
</p>
<br/>
</div>
</div>
<hr/>
<div class="flex-container">
<div>
<p>
<strong>Transkription:</strong>
</p>
<p>
<xsl:apply-templates select="content/body/div"/>
</p>
</div>
<div>
<p>
<strong>Übersetzung:</strong>
</p>
<p>
<xsl:apply-templates select="translation"/>
</p>
<br/>
</div>
</div>
</xsl:template>
<!-- WHG LINKS AUF EBENE DIV UND TEXT -->
<xsl:template match="div">
<p>
<xsl:apply-templates select="text"/>
</p>
</xsl:template>
<xsl:template match="place">
<a href="{@link}" target="_blank">
<xsl:value-of select="."/>
</a>
</xsl:template>
</xsl:stylesheet>