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>
我想将一个较大的 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>