XSL:合并两个 XML 文件的结果

XSL: combining the results of two XML files

我正在使用 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>

我什至不知道如何在一个 XSL 中访问两个单独的 XML 文件的基础知识!这阻止了我部署密钥等来合并记录。

非常感谢。

至于加载辅助文档,请使用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