【问题标题】:Transform XML to XML with XSLT and xsl: for-each使用 XSLT 和 xsl 将 XML 转换为 XML:for-each
【发布时间】:2021-01-10 22:18:38
【问题描述】:

我想用 XSLT 从另一个 XML 文件创建一个元数据 XML 文件。 input-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 并在单个创建者元素中收集每个作者的姓名和隶属关系?

【问题讨论】:

  • 用 persName/surname 替换 //surname。当你在你的 for-each 中时,你是在 的上下文中,通过使用 // 你回到输入文档的顶部。

标签: xml xslt foreach xslt-1.0


【解决方案1】:

您的指示:

<xsl:value-of select="//surname"/>

选择整个文档中的所有 surname 元素并返回第一个元素的值,无论您当前的上下文如何。

要选择作为当前author 后代的surname 元素,您需要执行以下操作:

<xsl:value-of select=".//surname"/>

或者 - 最好 - 使用完整的相对路径:

<xsl:value-of select="persName/surname"/>

其他元素也是如此。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-02-01
    • 2016-08-24
    • 1970-01-01
    • 1970-01-01
    • 2019-03-22
    • 2022-01-07
    • 1970-01-01
    相关资源
    最近更新 更多