使用 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&uuml;rgerl:[ichen] Tischlern in der K:[aiserlich]
              K:[&ouml;niglichen] Haubt = und Residenz Stadt <a href="http://whgazetteer.org/places/12346175/portal" target="_blank">Wien</a> (beglaubigen) hiermit,
              da&szlig; 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>