XSL 2.0 - создание отдельных URL-адресов из вложенных элементов - PullRequest
0 голосов
/ 16 октября 2018

У меня есть файлы tei-xml, в которых я размечал именованные объекты в средневековых документах, в частности имена людей, используя <persName/>.Простой пример:

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

Однако в рукописи часто встречаются имена, на которых мне нужно разметить «Raimunda uxor Bernardi Fabri» (т. Е. «Raimunda, жена Бернара Фора»).Здесь я размечаю оба имени в вложенном виде:

<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> является вложеннымdeep)

Я совершенно заблудился относительно того, как рекурсивно различать и обрабатывать //persName[x] и //persname[x]//persName[x], чтобы сделать их отдельными URL-адресами.

URL-адрес создается из статического значения +after-substring(//tei:persName/@nymRef,'#').Очевидно, что простой оператор XSL возвращает ошибку количества элементов:

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

Заранее большое спасибо за любую помощь.

1 Ответ

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

Если ваш 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>  
...