XSLT 2.0 分离两个递归输出

XSLT 2.0 separating two recursive outputs

XSLT fiddle 此处:https://xsltfiddle.liberty-development.net/bdxtqU/5

这个问题源于 我想输出的含义,使用 XSLT 2.0,<persName> 到 HTML URL,其中 <persName>可以在另一个<persName>里面找到,所以都变成了URLs.

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

输出到:

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

使用下面找到的代码。我也将它用于另一个 'named entity' 输出到 URL, <placeName>.

问题是 <persName> 可以像这样出现在 <placeName> 中(反之亦然):

<placeName type="event_loc" nymRef="#home_of_Guilhem_Vidal">in domo 
    <persName nymRef="#Guilhem_Vidal_MSP-AU" role="own">Willelmi Vitalis</persName></placeName>

我想要的是 <placeName><persName> 的分离,这样它们只创建嵌套的 URLs,其中相同的命名实体类型嵌套在命名实体中.

示意性地,这些将递归输出所有 <placeName><persName>:

 <persName>text
   <persName>text</persname>
   <persName>text</persname>
 </persName>

 <placeName>text
   <placeName>text</placename>
   <placeName>text</placename>
 </placeName>

但是这些只会将父实体输出为 URL,无论是 <placeName> 还是 <persName>,并绕过其中包含的命名实体:

 <persName nymRef="#Raimunda_Faure">Raimunda
   <placeName nymRef="#Toulouse">Toulouse</placename>
   <placeName nymRef="Paris">Paris</placename>
 </persName>

输出到<a href="www.foo.com/person/Raimunda_Faure">Raimunda Toulouse Paris</a>

 <placeName nymRef="#Toulouse">Toulouse
   <persName nymRef="#Raimunda_Faure">Raimunda</persname>
   <persName nymRef="#Bernard_Faure">Bernard</persname>
 </placeName>

输出到<a href="www.foo.com/place/Toulosue">Toulouse Raimunda Bernard</a>

这是两个现有的模板:

<xsl:template match="tei:text//tei:persName">
    <xsl:variable name="nested" select="tei:persName[1]|
                     tei:persName[1]/following-sibling::node()" />
    <xsl:element name="a"> 
        <xsl:attribute name="href"><xsl:value-of select="concat($paramPersonurl,substring-after(@nymRef,'#'))"/></xsl:attribute>
        <xsl:apply-templates select="node() except $nested" />
    </xsl:element>
    <xsl:apply-templates select="$nested" />
</xsl:template>

<xsl:template match="tei:text//tei:placeName">
    <xsl:variable name="nested" select="tei:placeName[1]|
                    tei:placeName[1]/following-sibling::node()" />
    <xsl:element name="a"> 
        <xsl:attribute name="href"><xsl:value-of select="concat($paramPersonurl,substring-after(@nymRef,'#'))"/></xsl:attribute>
        <xsl:apply-templates select="node() except $nested" />
    </xsl:element>
    <xsl:apply-templates select="$nested" />
</xsl:template>

看来我应该使用 [node()[name() != 'persName']] 之类的方法将另一个命名实体排除在 <xsl:apply-templates select="node() except $nested" /><xsl:apply-templates select="$nested" /> 中,但我没有成功。

提前致谢。

添加模板

<xsl:template match="tei:persName/tei:placeName | tei:placeName/tei:persName">
    <xsl:apply-templates/>
</xsl:template>

https://xsltfiddle.liberty-development.net/bdxtqU/7