сравнить значения в двух файлах XML - PullRequest
0 голосов
/ 29 мая 2018

У меня есть xml-файл termince.xml со следующим форматом:

<doc>
   <sentence id="sent_1" span="word_1..word_8"/>
   <sentence id="sent_2" span="word_9..word_15"/>
   <sentence id="sent_3" span="word_16..word_22"/>
   <sentence id="sent_4" span="word_23..word_30"/>
</doc>

Этот xml-файл показывает, что, например, мое первое предложение с @ id = "sent_1" - от word_1 до word_8.Второе предложение (@ id = "sent_2") - от word_9 до word_15 и т. Д.

Мой второй XML-файл verb.xml имеет следующий формат.

<verb id="v1" span="word_3"/>
<verb id="v2" span="word_7"/>
<verb id="v3" span="word_14"/>
<verb id="v4" span="word_27"/>

Что означает:первый глагол (@ id = "v1") равен "word_3";второй глагол (@ id = "v2") равен "word_7" и т. д.

Если мы сравним оба xml-файла, мы увидим, что, например, первый глагол (v1) в verb.xml, который является word_3, принадлежитпервое предложение (sent_1);третий глагол (v3), который представляет собой word_14, относится ко второму предложению (sent_2) и т. д.

В качестве результата я хочу сравнить значение атрибута span обоих файлов и увидеть, к какомупредложение, глагол принадлежит.Так, например, word_3 где-то в промежутке word_1..word_8 (который является нашим первым предложением).Вывод должен выглядеть следующим образом:

<verb id="v1" span="word_3" ref="sent_1"/>
<verb id="v2" span="word_7" ref="sent_1"/>
<verb id="v3" span="word_14" ref="sent_2"/>
<verb id="v4" span="word_27" ref="sent_4"/>

Надеюсь, мое объяснение понятно.Спасибо.

1 Ответ

0 голосов
/ 30 мая 2018

Вам необходимо извлечь числа из описаний диапазонов, например, word_1..word_8, а затем сослаться на них из числа, извлеченного из значения диапазона, например, word_3.В XSLT 3 это легко сделать с помощью ключа, настроенного для элемента sentence:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    exclude-result-prefixes="xs"
    version="3.0">

  <xsl:param name="sentence-doc">
    <doc>
       <sentence id="sent_1" span="word_1..word_8"/>
       <sentence id="sent_2" span="word_9..word_15"/>
       <sentence id="sent_3" span="word_16..word_22"/>
       <sentence id="sent_4" span="word_23..word_30"/>
    </doc>
  </xsl:param>

  <xsl:key name="ref" match="sentence" 
    use="let $numbers := analyze-string(@span, 'word_([0-9]+)\.\.word_([0-9]+)')//*:group/xs:integer(.)
         return $numbers[1] to $numbers[2]"/>

  <xsl:mode on-no-match="shallow-copy"/>

  <xsl:template match="verb">
      <verb id="{@id}" span="{@span}" ref="{key('ref', @span => replace('[^0-9]+', '')=>xs:integer(), $sentence-doc)/@id}"/>
  </xsl:template>

</xsl:stylesheet>

См. https://xsltfiddle.liberty -development.net / 3NzcBt2 для демонстрации в Интернете.Конечно, для вашего случая с двумя входными документами вы могли бы использовать <xsl:param name="sentence-doc" select="doc('sentence.xml')"/> вместо включения встроенных данных, как я делал в онлайн-примере.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...