XSLT 2.0, разделяющий два рекурсивных выхода - PullRequest
0 голосов
/ 21 октября 2018

XSLT скрипка здесь: https://xsltfiddle.liberty -development.net / bdxtqU / 5

Этот вопрос вытекает из последствий этого ответа , где я хотелвывод с использованием XSLT 2.0, <persName> в HTML-URL, где <persName> можно найти внутри другого <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>

Я бы хотел разделить <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']], но я не добился успеха.

Заранее спасибо.

1 Ответ

0 голосов
/ 21 октября 2018

Добавить шаблон

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

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

...