xsl: проверьте, равны ли обе строки, если это правда, отобразите другую строку

У меня есть первый TEI контент, используемый для XSLT, который вы можете найти здесь http://xsltfiddle.liberty-development.net/3Nqn5Y4/7

Второй TEI в corpus_ilimilku.xml, который мне нужно использовать в том же файле XSLT:

<category n="1"  xml:id="contend" ana="#verb.competition">
     <catDesc xml:lang="en">subcategory of competition verb: contend 
         <lang> 
             <ref n="1" target="http://babelnet.org">BabelNet<idno type="URI">http://live.babelnet.org/synset?word=bn:00083498v</idno></ref>
             <ref n="2" target="https://framenet2.icsi.berkeley.edu/">FrameNet<idno type="URI">https://framenet2.icsi.berkeley.edu/fnReports/data/frameIndex.xml?frame=Attaching"></idno></ref>
         </lang>
      </catDesc> 
      <category ana="#transcription" xml:lang="uga">
          <gloss n="1" xml:id="ḫṣb01" target="../uga/verb.xsl#ḫṣb"/>
          <gloss n="2" xml:id="mḫṣ01" cert="high" target="../uga/verb.xsl#mḫṣ"/> 
      </category>
</category>

У меня нет проблем со ссылкой на нужный файл. Я проверил, и это работает.

На самом деле у меня две проблемы:

  1. key из ref не работает, я думаю,
  2. поэтому, когда я хочу отобразить href5 из $value-doc2, если "$value-doc = translate($re-ana2, '#', '') верно, у меня есть следующее сообщение:

Описание. Последовательность из более чем одного элемента не допускается в качестве первого аргумента tokenize() (", "http://live.babelnet.org/synse...", "https://framenet2.icsi.berkeley.edu...")

В настоящее время работает "$value-doc = translate($re-ana2, '#', ''), так как я протестировал несколько значений, и результат true или false. См. последнее слово каждого <li>экран печати для ‹code›$check-id‹/code›

Что я хотел бы показать:

<h3>mḫṣ</h3><em>
mean.: </em>to figth, to destroy. Inflected forms attested:
<ul>
 <li>tmtḫṣ: gram. → Gt. ind. imperf. trans, 2msg, 3fsg. <em>trans. </em>she fought -- remark(s): iterative function // with “<a href="../computation/corpus_ilimilku.xml#ktu1-3_ii_l6b_t%E1%B8%ABt%E1%B9%A3b">tḫtṣb</a>.” Occur.: <a href="">ktu1.3:ii:l5b-6a</a> -- <em>analysis: </em>suggestion of 
  <a href="../computation/corpus_ilimilku.xml#ktu1-3_ii_l5b_6a_int">hermeneutics;</a> taxo., subcat. of competition v. “<a href="../computation/corpus_ilimilku.xml#m%E1%B8%AB%E1%B9%A301">contend</a>.” 
   <!-- DATA THAT I CANNOT DISPLAY : --> <a href="http://live.babelnet.org/synset?word=bn:00083498v">BabelNet</a>, <a href="https://framenet2.icsi.berkeley.edu/fnReports/data/frameIndex.xml?frame=Attaching">Framework</a>
  </li>
  <li>tmḫṣ: gram. → D. ind. perf. trans, 2msg, 3fsg. <em>trans. </em>she destroyed -- remark(s): 
  Occur.: <a href="">ktu1.3:ii:l7</a> -- <em>analysis: </em>suggestion of <a href="../computation/corpus_ilimilku.xml#ktu1-3_ii_l7_int">hermeneutics;</a> taxo., subcat. of emotion's v. as a concept of “<a href="../computation/corpus_ilimilku.xml#m%E1%B8%AB%E1%B9%A302">humiliation</a>.” 
   <!-- DATA THAT I CANNOT DISPLAY : --> <a href="http://live.babelnet.org/synset?word=bn:00083498v">BabelNet</a>, <a href="https://framenet2.icsi.berkeley.edu/fnReports/data/frameIndex.xml?frame=Attaching">Framework</a>
 </li>
</ul>

Подводя итог: если @xml:id из <gloss> второго TEI (corpus_ilimilku.xml) = @ana[2] из <re> текущего TEI (в содержимом Fiddle), то отобразите idno @type URI каждого ref, принадлежащего тому же родительскому узлу gloss.

Надеюсь, мое объяснение понятно. Извините за отсутствие английского...

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


person Vanessa    schedule 27.12.2017    source источник
comment
Правильный ответ ниже.   -  person Vanessa    schedule 31.12.2017


Ответы (2)


Если линия

<!-- DATA THAT I CANNOT DISPLAY : --> <a href="http://live.babelnet.org/synset?word=bn:00083498v">BabelNet</a>, <a href="https://framenet2.icsi.berkeley.edu/fnReports/data/frameIndex.xml?frame=Attaching">Framework</a>

предназначено для того, чтобы объяснить, что вы хотите преобразовать

document('../computation/corpus_ilimilku.xml')//lang/ref/idno

элементы в ссылки, а затем там, где вы хотите создать эти ссылки, используйте

<xsl:apply-templates select="document('../computation/corpus_ilimilku.xml')//lang/ref/idno"/>

а потом написать шаблон

<xsl:template match="idno">
  <a href="{.}">
    <xsl:value-of select="preceding-sibling::node()[1]"/>
  </a>
</xsl:template>

который производит эти ссылки (я не совсем уверен в содержании ссылки, для первого BabelNet похоже, как описано, для второго FrameNet против Framework).

Что касается использования ключей с несколькими документами, ключи работают на основе каждого документа, а функция key имеет необязательный третий аргумент, который вы можете указать для поиска, например, $doc2 со значениями из контекстного документа, например. key('key-name', (key-value-or-values), $doc2).

Я думаю, что ваше словесное описание

если @xml:id второго TEI (corpus_ilimilku.xml) = @ana[2] текущего TEI (в содержимом Fiddle), то отображать idno @type URI каждой ссылки, принадлежащей одному и тому же родительскому узлу глянца

транслируется в объявление ключа

<xsl:key name="gloss-ref" match="category[category/gloss]" use="category/gloss/@xml:id"/>

тогда предположим, что у нас есть глобальная переменная <xsl:variable name="doc2" select="doc('../computation/corpus_ilimilku.xml')"/> Я думаю, вы хотите использовать ключевую функцию, например.

<xsl:apply-templates select="key('gloss-ref', $re-ana2, $doc2)//lang/ref/idno"/>

для обработки соответствующих элементов idno.

person Martin Honnen    schedule 27.12.2017
comment
Спасибо @Мартин! Кажется, теперь я понимаю apply-templates. Что касается key, я сделал сейчас: <xsl:choose> <xsl:when test="$check-id = true()"> <xsl:if test="key('ref', @n and @type, document('../computation/corpus_ilimilku.xml'))"/> <xsl:apply-templates select="$idno-ref"/></xsl:when><xsl:otherwise/> </xsl:choose> (где $idno-ref для document('../computation/corpus_ilimilku.xml')//lang/ref/idno), но у меня есть все idno документа для каждой строки $check-id = true() . Что я делаю неправильно? - person Vanessa; 27.12.2017
comment
Я также пробовал xsl:for-each вместо xsl:if после последнего ответа ссылка, но опять же не работает. - person Vanessa; 27.12.2017
comment
Почему key('ref', @n and @type ...) использует логическое выражение @n and @type для значения ключа? - person Martin Honnen; 28.12.2017
comment
Верно. Поэтому я меняю на <xsl:if test="$check-id">. Я хочу отображать контент, только если $check-id. Но у меня пока все idno и по нескольку раз в каждом string. - person Vanessa; 28.12.2017
comment
Я нашел решение. Только что обновлен новым ответом. Еще раз спасибо @Мартин. - person Vanessa; 31.12.2017

Я нашел решение при любезной поддержке @Martin. Сначала я изменил второй TEI:

  <category n="1" xml:id="humiliation" ana="#verb.emotion">
     <catDesc >subcategory of emotion's verb as a concept of: humiliation
       <term ana="#mḫṣ02 #ṣmt01" type="baseForm">
          <ptr n="1" target="http://babelnet.org/synset?word=bn:00086117v" source="BabelNet" />
          <ptr n="2" target="" source="WordNet" next="{01804206}" />
          <ptr n="3" target="http://verbs.colorado.edu/propbank/framesets-english-aliases/humiliate.html" source="VerbNet" />
          <ptr n="4" target="http://verbs.colorado.edu/html_groupings/wound-n.html" source="VerbNet" />
          <ptr n="5" target="https://framenet2.icsi.berkeley.edu/fnReports/data/frameIndex.xml?frame=Stimulate_emotion" source="FrameNet" />
        </term>
      </catDesc>
      <category ana="#verb.emotion #humiliation" xml:lang="uga">
          <gloss n="1" xml:id="mḫṣ02" cert="high"/> 
      </category>  
    </category> 

Затем для XSL следующее дополнение:

<xsl:param name="f2" select="'../computation/corpus_ilimilku.xml'"/>

<!-- key to look for @xml:id of <gloss> within TEI -->
<xsl:key name="gloss-ref" match="category[category/gloss]" use="category/gloss/@xml:id"/>
<!-- variable for "f2" -->
<xsl:variable name="doc2" select="document($f2)"/>

<!-- within template match="entryFree" and <ul><li> -->
<xsl:apply-templates select="key('gloss-ref', translate($re-ana2, '#', ''), $doc2)//term/ptr[@target]"/>

<!-- template to display <xsl:apply-templates> -->
<xsl:template match="ptr">
    <xsl:variable name="href-ptr-target" select="@target"/>
    <a href="{$href-ptr-target}">
     <xsl:value-of select="@source"/>
     <xsl:if test="@next">
      <xsl:value-of select="@next"/>
     </xsl:if>
    <xsl:choose> <xsl:when test="position() != last()">
        <xsl:text>, </xsl:text> </xsl:when>
        <xsl:otherwise><xsl:text>. </xsl:text></xsl:otherwise>
    </xsl:choose></a>
</xsl:template> 

Результат, согласно Fiddle http://xsltfiddle.liberty-development.net/3Nqn5Y4/9, новое XSL (между <!-- --> в Fiddle) и второе содержимое TEI:

<ul>
  <li>tmḫṣ: gram. → D. ind. perf. trans, 2msg, 3fsg. <em>trans. </em>she destroyed -- remark(s): Occur.: <a href="">ktu1.3:ii:l7</a> -- <em>analysis: </em>suggestion of <a href="../computation/corpus_ilimilku.xml#ktu1-3_ii_l7_int">hermeneutics;</a> taxo., subcat. of emotion's v. as a concept of “<a href="../computation/corpus_ilimilku.xml#m%E1%B8%AB%E1%B9%A302">humiliation</a>.” Related to: <a href="http://babelnet.org/synset?word=bn:00086117v">BabelNet, </a><a href="">WordNet{01804206}, </a><a href="http://verbs.colorado.edu/propbank/framesets-english-aliases/humiliate.html">VerbNet, </a><a href="http://verbs.colorado.edu/html_groupings/wound-n.html">VerbNet, </a><a href="https://framenet2.icsi.berkeley.edu/fnReports/data/frameIndex.xml?frame=Stimulate_emotion">FrameNet.</a></li>
</ul>
person Vanessa    schedule 31.12.2017