XSL 2.0 - 从嵌套元素生成不同的 url

XSL 2.0 - generating distinct urls from nested elements

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

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

不过,稿件中经常有名字需要我标注"Raimunda uxor Bernardi Fabri"(即"Raimunda, wife of 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语句returns一个基数错误:

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

非常感谢您的帮助。

假设您的 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,则需要考虑命名空间)。

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

编辑:如果名称中还有其他标签,请尝试使用此模板,它将在 a 标签

中的第一个 persName 之前包装所有内容
<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>