我有一个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所以我希望有人可以建议如何做到这一点
答案 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() > 1"> // </xsl:if>
<xsl:value-of select="concat(LastName, ', ', Initials)"/>
</xsl:template>
</xsl:stylesheet>