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