XSLT——结果文档合并成一个杂乱的文件

XSLT – Result documents merged into one messy file

我想将一个较大的 XML 文件转换为较小的文件,并将数据存储在另一种 XML 中。 XSLT 似乎是显而易见的选择。但是我写的脚本产生了一个混乱的输出。它不是将条目分成不同的文件,而是创建包含所有条目的所有数据的文件。

这是源文件:

<RDF>
    <Manuscript>
        <authors>
            <Seq>
                <li>
                    <Person>
                       <surname>Meier</surname>
                        <givenName>Joseph</givenName>
                    </Person>
                </li>
            </Seq>
        </authors>
        <title>Poems</title>
        <language>German</language>
    </Manuscript>
    <Manuscript>
        <authors>
            <Seq>
                <li>
                    <Person>
                        <surname>Levinger</surname>
                        <givenName>Hans</givenName>
                    </Person>
                </li>
            </Seq>
        </authors>
        <title>The Arts Book</title>
        <language>English</language>
    </Manuscript>
    <Manuscript>
        <authors>
            <Seq>
                <li>
                    <Person>
                        <surname>Hills</surname>
                        <givenName>Samson</givenName>
                    </Person>
                </li>
            </Seq>
        </authors>
        <title>Creation</title>
        <language>English</language>
    </Manuscript>
</RDF>

这是我的 XSLT:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0" >
    <xsl:output encoding="UTF-8" indent="yes" method="xml" name="xml"/>
    <xsl:template match="/">
        <xsl:for-each select="/RDF/Manuscript">
            <xsl:result-document
                method="xml" include-content-type="no"
                href="{concat(Manuscript, position(), '.xml')}" format="xml">
                                        <msItem>
                                            <title>
                                                <xsl:value-of select="//title"/>
                                            </title>
                                            <xsl:apply-templates select="//authors//Person"/>
                                            <textLang>
                                                <xsl:value-of select="//language"/>
                                            </textLang>
                                        </msItem>
            </xsl:result-document>
        </xsl:for-each>
    </xsl:template>
    <xsl:template match="//authors//Person">
        <author>
            <persName>
                <xsl:apply-templates select="givenName"/>
                <xsl:text> </xsl:text>
                <xsl:apply-templates select="surname"/>
            </persName>
        </author>
    </xsl:template>
</xsl:stylesheet>

结果(1.xml、2.xml、3.xml):

<?xml version="1.0" encoding="UTF-8"?>
<msItem>
   <title>Poems The Arts Book Creation</title>
   <author>
      <persName>Joseph Meier</persName>
   </author>
   <author>
      <persName>Hans Levinger</persName>
   </author>
   <author>
      <persName>Samson Hills</persName>
   </author>
   <textLang>German English English</textLang>
</msItem>

预期结果:

1.xml

<?xml version="1.0" encoding="UTF-8"?>
<msItem>
   <title>Poems</title>
   <author>
      <persName>Joseph Meier</persName>
   </author>
   <textLang>German</textLang>
</msItem>

2.xml

<?xml version="1.0" encoding="UTF-8"?>
<msItem>
   <title>The Arts Book</title>
   <author>
      <persName>Hans Levinger</persName>
   </author>
   <textLang>English</textLang>
</msItem>

3.xml

<?xml version="1.0" encoding="UTF-8"?>
<msItem>
   <title>Creation</title>
   <author>
      <persName>Samson Hills</persName>
   </author>
   <textLang>English</textLang>
</msItem>

我已经多次重建 XSLT,但我还没有找到我的错误所在。

使用 for-each 内的相对路径,例如从<xsl:result-document method="xml" include-content-type="no" href="{concat(title, position(), '.xml')}" format="xml"> 并继续

<msItem>
                                        <title>
                                            <xsl:value-of select="title"/>
                                        </title>
                                        <xsl:apply-templates select="authors//Person"/>
                                        <textLang>
                                            <xsl:value-of select="language"/>
                                        </textLang>
                                    </msItem>