我正在尝试为MODS元数据架构创建转换,并可以使用一些帮助。
此部分的基本xml如下所示:
<subject authority="lcsh">
<name type="corporate">
<namePart>Hypothetical College (Hypothesis, NJ.)</namePart>
</name>
<titleInfo>
<title/>
</titleInfo>
<topic>Students</topic>
<genre>Periodicals</genre>
</subject>
希望将其作为假设学院(假设,新泽西州) - 学生 - 期刊
我的结果看起来更像是:假设学院(假设,新泽西州) - - 学生 - 期刊
我的代码部分如下:
<xsl:template match="mods:mods/mods:subject">
<tr>
<td class="standardFieldName">Subject(s)</td>
<td class="standardFieldValue">
<xsl:call-template name="join">
<xsl:with-param name="valueList" select="*"/>
<xsl:with-param name="separator" select="' -- '"/>
</xsl:call-template>
<xsl:text>

</xsl:text>
</td>
</tr>
</xsl:template>
<xsl:template name="join" >
<xsl:param name="valueList" select="''"/>
<xsl:param name="separator" select="','"/>
<xsl:for-each select="$valueList">
<xsl:choose>
<xsl:when test="position() = 1">
<xsl:value-of select="."/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="concat($separator, .) "/>
</xsl:otherwise>
</xsl:choose>
</xsl:for-each>
</xsl:template>
这里有两个问题。一,插入空元素和相关的分隔符。第二,如果有什么东西在&#34;名称&#34;元素,但如果第一个非空元素是其他任何一个,我也得到 - 事先。我猜测&#34; position()= 1&#34;只考虑元素在xml文件中的位置,那么有没有办法将它应用到第一个非空元素?
提前致谢。
答案 0 :(得分:1)
我认为你只需要在这里使用normalize-space()
来忽略空元素......
<xsl:template match="subject">
<tr>
<td class="standardFieldName">Subject(s)</td>
<td class="standardFieldValue">
<xsl:call-template name="join">
<xsl:with-param name="valueList" select="*[normalize-space()]"/>
<xsl:with-param name="separator" select="' -- '"/>
</xsl:call-template>
<xsl:text>

</xsl:text>
</td>
</tr>
</xsl:template>
<xsl:template name="join">
<xsl:param name="valueList" select="''"/>
<xsl:param name="separator" select="','"/>
<xsl:for-each select="$valueList">
<xsl:if test="position() > 1">
<xsl:value-of select="$separator" />
</xsl:if>
<xsl:value-of select="normalize-space()"/>
</xsl:for-each>
</xsl:template>
注意我简化了&#34;加入&#34;模板,以减少所需的代码量。