使用 XSLT 和 xsl:for-each 将 XML 转换为 XML
Transform XML to XML with XSLT and xsl: for-each
我想使用 XSLT 从另一个 XML 文件创建一个元数据 XML 文件。
输入-xml 看起来像这样:
<TEI>
<teiHeader>
<fileDesc>
<titleStmt>
<author>
<persName>
<surname>Doe</surname>
<forename>Jane</forename>
</persName>
<affiliation>UniversityA</affiliation>
</author>
<author>
<persName>
<surname>Smith</surname>
<forename>John</forename>
</persName>
<affiliation>UniversityB</affiliation>
</author>
</titleStmt>
</fileDesc>
</teiHeader>
</TEI>
我要创建的输出元数据文件应该如下所示:
<metadata>
<creators>
<creator>
<name>Doe, Jane</name>
<affiliation>UniversityA</affiliation>
</creator>
<creator>
<name>Smith, Jon</name>
<affiliation>UniversityB</affiliation>
</creator>
</creators>
</metadata>
我使用了这样的 XSLT 样式表:
<creators><xsl:for-each select="TEI/teiHeader/fileDesc/titleStmt/author">
<creator>
<name><xsl:value-of select="//surname"/>, <xsl:value-of select="//forename"/></name>
<affiliation><xsl:value-of select="//affiliation"/></affiliation>
</creator></xsl:for-each>
</creators>
但是输出看起来像这样:
<metadata>
<creators>
<creator>
<name>Doe, Jane</name>
<affiliation>UniversityA</affiliation>
</creator>
<creator>
<name>Doe, Jane</name>
<affiliation>UniversityA</affiliation>
</creator>
</creators>
</metadata>
所以我的问题是:如何循环输入-xml并收集每个作者的姓名和从属关系到单个创作者元素中?
您的指令:
<xsl:value-of select="//surname"/>
selects all surname
整个文档中的元素和 returns 第一个元素的值,无论您当前的上下文如何.
要 select 作为当前 author
后代的 surname
元素,您需要执行以下操作:
<xsl:value-of select=".//surname"/>
或者 - 最好 - 使用完整的相对路径:
<xsl:value-of select="persName/surname"/>
其他元素也一样。
我想使用 XSLT 从另一个 XML 文件创建一个元数据 XML 文件。 输入-xml 看起来像这样:
<TEI>
<teiHeader>
<fileDesc>
<titleStmt>
<author>
<persName>
<surname>Doe</surname>
<forename>Jane</forename>
</persName>
<affiliation>UniversityA</affiliation>
</author>
<author>
<persName>
<surname>Smith</surname>
<forename>John</forename>
</persName>
<affiliation>UniversityB</affiliation>
</author>
</titleStmt>
</fileDesc>
</teiHeader>
</TEI>
我要创建的输出元数据文件应该如下所示:
<metadata>
<creators>
<creator>
<name>Doe, Jane</name>
<affiliation>UniversityA</affiliation>
</creator>
<creator>
<name>Smith, Jon</name>
<affiliation>UniversityB</affiliation>
</creator>
</creators>
</metadata>
我使用了这样的 XSLT 样式表:
<creators><xsl:for-each select="TEI/teiHeader/fileDesc/titleStmt/author">
<creator>
<name><xsl:value-of select="//surname"/>, <xsl:value-of select="//forename"/></name>
<affiliation><xsl:value-of select="//affiliation"/></affiliation>
</creator></xsl:for-each>
</creators>
但是输出看起来像这样:
<metadata>
<creators>
<creator>
<name>Doe, Jane</name>
<affiliation>UniversityA</affiliation>
</creator>
<creator>
<name>Doe, Jane</name>
<affiliation>UniversityA</affiliation>
</creator>
</creators>
</metadata>
所以我的问题是:如何循环输入-xml并收集每个作者的姓名和从属关系到单个创作者元素中?
您的指令:
<xsl:value-of select="//surname"/>
selects all surname
整个文档中的元素和 returns 第一个元素的值,无论您当前的上下文如何.
要 select 作为当前 author
后代的 surname
元素,您需要执行以下操作:
<xsl:value-of select=".//surname"/>
或者 - 最好 - 使用完整的相对路径:
<xsl:value-of select="persName/surname"/>
其他元素也一样。