XSL: объединение результатов двух файлов XML - PullRequest
0 голосов
/ 04 июня 2018

Я использую XSL 3.0 для создания одного XML-файла, который объединяет два исходных XML-файла (XSL и оба XML-файла в одном каталоге).Источники называются people.xml и depositions.xml.

Файл people.xml представляет собой список людей и выглядит следующим образом:

<personlist>
 <person id="foo_andrew">
  <lastname>Foo</lastname>
  <firstname>Andrew</firstname>
 </person>
 <person id="foo_barbara">
  <lastname>Foo</lastname>
  <firstname>Barbara</firstname>
 </person>
 <person id="foo_chris">
  <lastname>Foo</lastname>
  <firstname>Chris</firstname>
 </person>
 ...
</personlist>

Эти люди из этого файла появляютсяв файле смещения, используя @id:

<corpus>
  <deposition id="1">
   <p n="1">Suspendisse eu nunc <person id="foo_andrew"/>tristique ex aliquam imperdiet. Quisque volutpat est sed <person id="foo_barbara"/>ullamcorper ultricies. Proin vel nunc in arcu tristique finibus.</p>
   <p n="2">Cras a dolor consequat,  <person id="foo_chris"/>congue leo et, porttitor mi. Integer pretium tellus id lobortis faucibus.</p>
   <p n="3">Quisque facilisis dui tincidunt <person id="foo_andrew"/>semper blandit. Aenean auctor sem augue, sit amet malesuada neque mattis id.</p>
  </deposition>
  <deposition id="2">
   <p n="1">Suspendisse eu nunc tristique ex aliquam imperdiet. Quisque volutpat est sed ullamcorper ultricies. Proin vel nunc in arcu tristique finibus.</p>
   <p n="2">Cras a dolor consequat, congue leo et, <person id="foo_barbara"/>porttitor mi. Integer pretium tellus id lobortis faucibus.</p>
   <p n="3">Quisque facilisis dui <person id="foo_chris"/>tincidunt semper blandit. Aenean auctor sem augue, sit amet malesuada neque mattis id.</p>
  </deposition>
  <deposition id="3">
   <p n="1">Suspendisse eu nunc tristique <person id="foo_chris"/>ex aliquam imperdiet. Quisque volutpat est sed ullamcorper ultricies. Proin vel nunc in arcu tristique finibus.</p>
   <p n="2">Cras a <person id="foo_andrew"/>dolor consequat, congue leo et, porttitor mi. Integer pretium tellus id lobortis faucibus.</p>
   <p n="3">Quisque <person id="foo_barbara"/>facilisis dui tincidunt semper blandit. Aenean auctor sem augue, sit amet malesuada neque mattis id.</p>
  </deposition>
</corpus>

Я хотел бы вывести XML-файл, который объединяет все образы человека в один файл.Это выглядело бы примерно следующим образом, где - <deposition> создается для каждого раза, когда человек появляется в отстранении - но создается только один <deposition>, даже если они появляются несколько раз

<personappear>
 <person id="foo_andrew">
  <lastname>Foo</lastname>
  <firstname>Andrew</firstname>
  <listappear>
   <deposition>1</deposition>
   <deposition>3</deposition>
  </listappear>
 </person>
 <person id="foo_barbara">
  <lastname>Foo</lastname>
  <firstname>Barbara</firstname>
  <listappear>
   <deposition>1</deposition>
   <deposition>2</deposition>
   <deposition>3</deposition>
  </listappear>
 </person>
 <person id="foo_chris">
  <lastname>Foo</lastname>
  <firstname>Chris</firstname>
  <listappear>
   <deposition>1</deposition>
   <deposition>2</deposition>
   <deposition>3</deposition>
  </listappear>
 </person>
 ...
</personlist>

Я не могу даже понять основы того, как получить доступ к двум отдельным файлам XML в одном XSL!Это мешает мне использовать ключи и т. Д. Для объединения записей.

Заранее большое спасибо.

1 Ответ

0 голосов
/ 05 июня 2018

Что касается загрузки вторичного документа, используйте doc('depositions.xml') или document('depositions.xml').Для справки вы правы, что ключ помогает:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    expand-text="yes"
    version="3.0">

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

  <xsl:output indent="yes"/>

  <!-- make <xsl:param name="deposition-doc" select="doc('depositions.xml')"/> -->
  <xsl:param name="deposition-doc">
    <corpus>
      <deposition id="1">
       <p n="1">Suspendisse eu nunc <person id="foo_andrew"/>tristique ex aliquam imperdiet. Quisque volutpat est sed <person id="foo_barbara"/>ullamcorper ultricies. Proin vel nunc in arcu tristique finibus.</p>
       <p n="2">Cras a dolor consequat,  <person id="foo_chris"/>congue leo et, porttitor mi. Integer pretium tellus id lobortis faucibus.</p>
       <p n="3">Quisque facilisis dui tincidunt <person id="foo_andrew"/>semper blandit. Aenean auctor sem augue, sit amet malesuada neque mattis id.</p>
      </deposition>
      <deposition id="2">
       <p n="1">Suspendisse eu nunc tristique ex aliquam imperdiet. Quisque volutpat est sed ullamcorper ultricies. Proin vel nunc in arcu tristique finibus.</p>
       <p n="2">Cras a dolor consequat, congue leo et, <person id="foo_barbara"/>porttitor mi. Integer pretium tellus id lobortis faucibus.</p>
       <p n="3">Quisque facilisis dui <person id="foo_chris"/>tincidunt semper blandit. Aenean auctor sem augue, sit amet malesuada neque mattis id.</p>
      </deposition>
      <deposition id="3">
       <p n="1">Suspendisse eu nunc tristique <person id="foo_chris"/>ex aliquam imperdiet. Quisque volutpat est sed ullamcorper ultricies. Proin vel nunc in arcu tristique finibus.</p>
       <p n="2">Cras a <person id="foo_andrew"/>dolor consequat, congue leo et, porttitor mi. Integer pretium tellus id lobortis faucibus.</p>
       <p n="3">Quisque <person id="foo_barbara"/>facilisis dui tincidunt semper blandit. Aenean auctor sem augue, sit amet malesuada neque mattis id.</p>
      </deposition>
    </corpus>      
  </xsl:param>

  <xsl:key name="ref" match="deposition" use=".//person/@id"/>

  <xsl:template match="person">
      <xsl:copy>
          <xsl:copy-of select="@*, node()"/>
          <listappear>
              <xsl:for-each select="key('ref', @id, $deposition-doc)">
                  <deposition>{@id}</deposition>
              </xsl:for-each>
          </listappear>
      </xsl:copy>
  </xsl:template>

</xsl:stylesheet>

https://xsltfiddle.liberty -development.net / jyH9rMf

...