0

XSLT 小提琴在这里:https ://xsltfiddle.liberty-development.net/bdxtqU/5

这个问题源于这个答案的含义,我想使用 XSLT 2.0 将其输出<persName>到 HTML URL 中,<persName>可以在其中找到 another <persName>,因此所有内容都转换为 URL。

<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>

使用下面找到的代码。我还将它用于另一个“命名实体”,该实体将输出到 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>

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

从原理上讲,这些将递归地输出所有<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>

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

提前致谢。

4

1 回答 1

1

添加模板

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

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

于 2018-10-21T16:17:15.077 回答