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