1

当文章有多个作者时,我有一个 XML 输出文件(用于引用),其中包含重复作者的数据,如下所示:

<Affiliation>a School of Architecture and Urban Planning , Nanjing University , Nanjing , China.</Affiliation>
        <AuthorList CompleteYN="Y">
            <Author ValidYN="Y">
                <LastName>Gao</LastName>
                <ForeName>Zhi</ForeName>
                <Initials>Z</Initials>
            </Author>
            <Author ValidYN="Y">
                <LastName>Zhang</LastName>
                <ForeName>J S</ForeName>
                <Initials>JS</Initials>
            </Author>
            <Author ValidYN="Y">
                <LastName>Byington</LastName>
                <ForeName>Jerry G A</ForeName>
                <Initials>JG</Initials>
            </Author>
        </AuthorList>
        <Language>eng</Language>

我想做的是最终得到一个加入作者的文件,以便你最终得到

<Authors>Gao, Z // Zhang, JS // Byington, JG</Authors>

因此,使用 LastName 和 Initials 并将它们之间的分隔符添加到一个字段中

这是我第一次看到这个和 xsl,所以我希望有人能建议如何做到这一点

4

2 回答 2

1

该样式表将满足您的要求。它复制整个文档,除了任何AuthorList元素,这些元素按照您的描述进行转换。

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

  <xsl:strip-space elements="*"/>
  <xsl:output method="xml" indent="yes" encoding="UTF-8"/>

  <xsl:template match="/">
    <xsl:apply-templates/>
  </xsl:template>

  <xsl:template match="@*|node()">
    <xsl:copy>
    <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="AuthorList">
    <Authors>
      <xsl:apply-templates select="Author"/>
    </Authors>
  </xsl:template>

  <xsl:template match="Author">
    <xsl:if test="preceding-sibling::Author">
      <xsl:text> // </xsl:text>
    </xsl:if>
    <xsl:value-of select="concat(LastName, ', ', Initials)"/>
  </xsl:template>

</xsl:stylesheet>

输出

<?xml version="1.0" encoding="UTF-8"?>
<root>
   <Affiliation>a School of Architecture and Urban Planning , Nanjing University , Nanjing , China.</Affiliation>
   <Authors>Gao, Z // Zhang, JS // Byington, JG</Authors>
   <Language>eng</Language>
</root>
于 2013-06-03T16:00:46.873 回答
1

您可能对稍短一些的替代方案感兴趣。

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
  <xsl:output omit-xml-declaration="no" indent="yes"/>
  <xsl:strip-space elements="*"/>

  <xsl:template match="@*|node()">
    <xsl:copy>
      <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="AuthorList">
    <Authors>
      <xsl:apply-templates/>
    </Authors>
  </xsl:template>

  <xsl:template match="Author">
    <xsl:if test="position() &gt; 1"> // </xsl:if>
    <xsl:value-of select="concat(LastName, ', ', Initials)"/>
  </xsl:template>

</xsl:stylesheet>
于 2013-06-03T17:40:08.040 回答