如何在没有额外分隔符的情况下省略分离的Concat列表中的元素

时间:2018-01-30 15:22:12

标签: xml xslt

我正在尝试为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>&#xa;&#xd;</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文件中的位置,那么有没有办法将它应用到第一个非空元素?

提前致谢。

1 个答案:

答案 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>&#xa;&#xd;</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;模板,以减少所需的代码量。