将重复的XML字段连接成1

时间:2013-06-03 15:48:21

标签: xml xslt

我有一个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所以我希望有人可以建议如何做到这一点

2 个答案:

答案 0 :(得分: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>

答案 1 :(得分: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>