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

时间:2018-06-04 20:47:21

标签: xml xslt xslt-3.0

我正在使用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文件的基础知识!这阻止我部署密钥等来组合记录。

非常感谢。

1 个答案:

答案 0 :(得分:1)

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