0

我有 tei-xml 文件,我在其中标记了中世纪文档中的命名实体,特别是使用<persName/>. 一个简单的例子:

<persName nymref="#Bernard_Faure_Senior">Bernardus Fabri senior</persName>

然而,手稿中经常有一些名字需要我标记为“Raimunda uxor Bernardi Fabri”(即“Raimunda,Bernard Faure 的妻子”)。在这里,我以嵌套方式标记了这两个名称:

<persName nymref="#Raimunda_Faure">Raimunda uxor 
   <persName nymref="#Bernard_Faure_Senior">Bernardi Fabri 
                       senior</persName></persName>

通常这对于查询数据来说不是问题。但是,我想通过 XSLT 2.0 为网页输出以下内容,其中每个名称都转换为指向该人自己网页的 URL(使用@nymRef)。上面应该输出到这个:

 <a href="www.foo.com/person/Raimunda_Faure">Raimunda 
        uxor</a><a href="www.foo.com/person/Bernard_Faure_Senior">Bernardi 
       Fabri<a>

(即。...etiam nec tortor erat Raimunda uxor Bernardi Fabri est leo cursus magna, maximus finibus...)

此外,有时会发生以下情况(两个名称嵌套在一个中):

 <persName nymref="#Raimunda_Faure">Raimunda uxor 
   <persName nymref="#Bernard_Faure_Senior">Bernardi Fabri 
                       senior</persName> matris 
   <persName nymRef="Bernard_Faure_Junior">Bernardi 
                       junior</persName></persName>

(虽然从来没有<persName>嵌套三层的情况)

我完全不知道如何递归地区分和处理//persName[x]以及 //persname[x]//persName[x]使它们成为单独的 URL。

url 是从静态值 + 生成的after-substring(//tei:persName/@nymRef,'#')。显然,一个简单的 XSL 语句会返回一个基数错误:

concat('www.foo.com/person',after-substring(//tei:persName/@nymRef,'#'))

非常感谢您的任何帮助。

4

1 回答 1

1

假设您的 XML 看起来像这样......

<persName nymref="#Raimunda_Faure">Raimunda uxor 
   <persName nymref="#Bernard_Faure_Senior">Bernardi Fabri senior</persName> matris   
   <persName nymRef="Bernard_Faure_Junior">Bernardi junior</persName>
</persName>

然后您可以通过将此模板添加到您的 XSLT 来实现您的目标

<xsl:template match="persName">
  <a href="www.foo.com/person/{substring-after(@nymref, '#')}">
    <xsl:value-of select="text()[1]" />
  </a>
  <xsl:apply-templates select="node()[position() > 1]" />
</xsl:template>

(尽管如果您正在处理 TEI,则需要考虑命名空间)。

这确实假设名称中没有其他类型的标签。

编辑:如果名称中有其他标签,请尝试使用此模板,它将包装标签persName中第一个之前的所有内容a

<xsl:template match="persName">
  <xsl:variable name="nested" select="persName[1]|persName[1]/following-sibling::node()" />
  <a href="www.foo.com/person/{substring(@nymref, 2)}">
    <xsl:apply-templates select="node() except $nested" />
  </a>
  <xsl:apply-templates select="$nested" />
</xsl:template>  
于 2018-10-16T13:58:07.847 回答