включить значения из одного файла XML в другой. - PullRequest
0 голосов
/ 30 сентября 2018

У меня есть следующие xml-файлы (назовем их para.xml и termince.xml).

Paragraph.xml

<?xml version="1.0" encoding="UTF-8"?>
<paragraphs>
     <paragraph id="par_1" parBegin="1" parEnd="100" par_type="intro" context="positive"/>
     <paragraph id="par_2" parBegin="101" parEnd="170" par_type="elaboration" context="negative"/>
     <paragraph id="par_3" parBegin="171" parEnd="210" par_type="elaboration" context="positive"/>
     <paragraph id="par_4" parBegin="211" parEnd="280" par_type="conclusion" context="neutral"/>

В файле para.xml атрибут " parBegin " показывает номер слова, с которого начинается абзац, а " parEnd " показывает номер слова в конце абзаца.Например, первый элемент абзаца начинается со слова 1 (значение атрибута parBegin) и заканчивается словом 100 (первый абзац содержит 100 слов).

Другой xml-файл termince.xml содержит информацию о предложениях того же текста.

<?xml version="1.0" encoding="UTF-8"?>
 <sentences>
     <sentence id="sent_1" sentBegin="1" sentEnd="15" sent_type="question"/>
     <sentence id="sent_2" sentBegin="16" sentEnd="30" sent_type="imperative"/>
     <sentence id="sent_3" sentBegin="31" sentEnd="37" sent_type="confirmation"/>
     ...
     <sentence id="sent_15" sentBegin="120" sentEnd="125" sent_type="conclusion" />

В файле termince.xml атрибут " sentBegin " показывает номер слова, с которого начинается предложение, и " sentEnd * 1030"* "показывает номер слова в конце абзаца.Например, первый элемент предложения начинается со слова 1 (значение атрибута sentBegin) и заканчивается словом 15 .Предложение с id = "sent_15" начинается со слова 120 (sentBegin = "120") и заканчивается словом 125 (sentEnd = "125").

Я хочу проверить, к какому абзацу относится каждое предложение. Другими словами, сравнить значение атрибута @ sentEnd со значениематрибут @ parEnd .Если @ sentEnd больше @ parBegin и меньше @ parEnd элемента абзаца, это означает, что предложение принадлежит этому абзацу.Например, значение sentEnd предложения (id = "sent_15") равно 125 ( sentEnd = "125" ), что больше @ parBegin (parBegin = "101") значение абзаца с id =" par_2 " и меньшим, чем его @ parEnd (parEnd =" 170 ") значений.Это показывает, что предложение id = "sent_15" относится к пункту id = "par_2" .Желаемый результат выглядит следующим образом:

<?xml version="1.0" encoding="UTF-8"?>
 <sentences>
     <sentence id="sent_1" sentBegin="1" sentEnd="15" sent_type="question" paragraph="par_1" par_type="intro"/>
     <sentence id="sent_2" sentBegin="16" sentEnd="30" sent_type="imperative" paragraph="par_1" par_type="intro"/>
     <sentence id="sent_3" sentBegin="31" sentEnd="37" sent_type="confirmation" paragraph="par_1" par_type="intro"/>
     ...
     <sentence id="sent_15" sentBegin="120" sentEnd="125" sent_type="conclusion" paragraph="par_2" par_type="elaboration" />

Большое спасибо за ваш отзыв / решение.

1 Ответ

0 голосов
/ 30 сентября 2018

Похоже, вы можете просто выбрать правильное значение paragraph с помощью предиката:

  <xsl:template match="sentence">
      <xsl:copy>
          <xsl:apply-templates 
             select="@*, 
                     $paragraph-doc/paragraphs/paragraph[xs:integer(@parBegin) &lt;= xs:integer(current()/@sentBegin) and xs:integer(@parEnd) >= xs:integer(current()/@sentEnd)]/(@id, @par_type)"/>
      </xsl:copy>
  </xsl:template>

В следующем я включил документ параграфа в параметр, но вы, конечно, могли бы загрузить его вместо этого, используяdoc function:

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

  <xsl:param name="paragraph-doc">
    <paragraphs>
         <paragraph id="par_1" parBegin="1" parEnd="100" par_type="intro" context="positive"/>
         <paragraph id="par_2" parBegin="101" parEnd="170" par_type="elaboration" context="negative"/>
         <paragraph id="par_3" parBegin="171" parEnd="210" par_type="elaboration" context="positive"/>
         <paragraph id="par_4" parBegin="211" parEnd="280" par_type="conclusion" context="neutral"/>
    </paragraphs>
  </xsl:param>

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

  <xsl:template match="sentence">
      <xsl:copy>
          <xsl:apply-templates 
             select="@*, 
                     $paragraph-doc/paragraphs/paragraph[xs:integer(@parBegin) &lt;= xs:integer(current()/@sentBegin) and xs:integer(@parEnd) >= xs:integer(current()/@sentEnd)]/(@id, @par_type)"/>
      </xsl:copy>
  </xsl:template>

  <xsl:template match="paragraph/@id">
      <xsl:attribute name="paragraph" select="."/>
  </xsl:template>

</xsl:stylesheet>

https://xsltfiddle.liberty -development.net / nc4NzQZ - это образец XSLT 3, для XSLT 2 вам необходимо заменить используемое объявление xsl:mode нашаблон преобразования идентичности.

В качестве уточнения или альтернативы вышеприведенному, мы могли бы ввести paragraph элементы в @parBegin to @parEnd и затем использовать этот ключ, чтобы найти соответствующий абзац из предложения:

<?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="#all"
    version="3.0">

  <xsl:param name="paragraph-doc">
    <paragraphs>
         <paragraph id="par_1" parBegin="1" parEnd="100" par_type="intro" context="positive"/>
         <paragraph id="par_2" parBegin="101" parEnd="170" par_type="elaboration" context="negative"/>
         <paragraph id="par_3" parBegin="171" parEnd="210" par_type="elaboration" context="positive"/>
         <paragraph id="par_4" parBegin="211" parEnd="280" par_type="conclusion" context="neutral"/>
    </paragraphs>
  </xsl:param>

  <xsl:key name="par-ref" match="paragraph" use="@parBegin to @parEnd"/>

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

  <xsl:template match="sentence">
      <xsl:copy>
          <xsl:apply-templates 
             select="@*, 
                     key('par-ref', xs:integer(@sentEnd), $paragraph-doc)/(@id, @par_type)"/>
      </xsl:copy>
  </xsl:template>

  <xsl:template match="paragraph/@id">
      <xsl:attribute name="paragraph" select="."/>
  </xsl:template>

</xsl:stylesheet>

https://xsltfiddle.liberty -development.net / nc4NzQZ / 2

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