xsl: когда два узла равны, отображается дочерний элемент первого узла - PullRequest
0 голосов
/ 30 апреля 2018

Я использую XML Editor 19.1, Saxon P.E 9.7.

Для каждого выбранного div я хочу отобразить graphic/@url после каждого <surface>, если surface/@xml:id = div/@facs.

XSL

 <xsl:for-each select="descendant-or-self::div3[@type='col']/div4[@n]">
  <xsl:variable name="div4tablet" select="@facs"/>
   <xsl:choose>
    <xsl:when test="translate(.[@n]/$div4tablet, '#', '') = preceding::facsimile/surfaceGrp[@type='tablet']/surface[@n]/@xml:id">
     <xsl:value-of select=""/> <!-- DISPLAY graphic/@url that follows facsimile/surfaceGrp/surface -->
    </xsl:when>
    <xsl:otherwise/>
   </xsl:choose>
  [....]
 </xsl:for-each> 

TEI пример

 <facsimile>     
  <surfaceGrp n="1" type="tablet">
   <surface n="1.1" xml:id="ktu1-2_i_1_to_10_img">
    <graphic url="../img/KTU-1-2-1-10-recto.jpg"/>
    <zone xml:id=""/>
    <zone xml:id=""/>
   </surface>
    <surface n="1.2" xml:id="ktu1-2_i_10_to_30_img">
    <graphic url="../img/KTU-1-2-10-30-recto.jpg"/>
    <zone xml:id=""/>
   </surface>
   [...]
  </surfaceGrp>
  <surfaceGrp n="2">
  [...]
  </surfaceGrp>
 </facsimile>


 <text>
  [...]
  <div3 type="col">
   <div4 n="1.2.1-10" xml:id="ktu1-2_i_1_to_10" facs="#ktu1-2_i_1_to_10_img">
    [...]
   </div4>
   <div4 n="1.2.10-30" xml:id="ktu1-2_i_10_to_30" facs="#ktu1-2_i_10_to_30_img">
    [...]
   </div4>
  </div3>
 </text> 

Я пытался <xsl:value-of select="preceding::facsimile/surfaceGrp[@type='tablet']/surface[@n, @xml:id]/graphic/@url"/>, но он отображает все graphic/@url, а не только тот, который следует за fascsimile/surfaceGrp/surface. Так что мой вопрос: как отобразить только surface/graphic/@url для каждого div3[@type='col']/div4[@n]?

Заранее спасибо за помощь.

Ответы [ 2 ]

0 голосов
/ 30 апреля 2018

Поскольку вы используете XSLT 2 или 3, а элементы имеют атрибут xml:id, вам даже не нужен ключ, но вы можете использовать функцию id:

  <xsl:template match="div4">
      <div>
          <xsl:value-of select="id(substring(@facs, 2))/graphic/@url"/>
      </div>
  </xsl:template>

Я использовал id в шаблоне, соответствующем элементу div4, но вы, конечно, можете использовать его так же, как и в вашем for-each при выборе этих элементов.

См. Минимальный, но полный образец по адресу https://xsltfiddle.liberty -development.net / bdxtpR .

0 голосов
/ 30 апреля 2018

вы должны использовать xsl:key для этого типа проблемы.

Сначала мы должны объявить ключ для целевого узла

<xsl:key name="kSurface" match="surface" use="concat('#', @xml:id)"/>

обратите внимание, что здесь используется функция concat, к xml: id добавляется #, чтобы ключи выглядели как:

#ktu1-2_i_1_to_10_img
#ktu1-2_i_10_to_30_img

сейчас в этом цикле:

<xsl:for-each select="descendant-or-self::div3[@type='col']/div4[@n]">

мы можем получить доступ к ключу, который соответствует атрибуту @facs, имея:

 <xsl:value-of select="key('kSurface', @facs)/graphic/@url"/>

Вся таблица стилей ниже:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    exclude-result-prefixes="xs"
    version="1.0">

    <xsl:output omit-xml-declaration="yes"/>

    <xsl:key name="kSurface" match="surface" use="concat('#', @xml:id)"/>

    <xsl:template match="/">
        <xsl:for-each select="descendant-or-self::div3[@type='col']/div4[@n]">
            <xsl:value-of select="key('kSurface', @facs)/graphic/@url"/>
            <xsl:text>&#xA;</xsl:text>
        </xsl:for-each> 
    </xsl:template>

</xsl:stylesheet>

увидеть это в действии здесь .

...