首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >XSL:组合两个XML文件的结果

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

Stack Overflow用户
提问于 2018-06-05 04:47:21
回答 1查看 42关注 0票数 0

我正在使用XSL3.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文件的基本原理!这阻止了我部署密钥等来组合记录。

非常提前谢谢你。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-06-05 05:12:55

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50688532

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档