XSLT - 在新父级内组合foreach值

时间:2018-03-16 23:39:38

标签: xml xslt foreach dspace

我正在学习XSLT 1.0,我也有一点逻辑和知识问题。我正在使用dspace 6,我想更改一些xslt行代码的输出。

当我用:

检索一些元数据时
<xsl:for-each select="doc:metadata/doc:element[@name='dc']/doc:element[@name='date']/doc:element[@name='dateType']/doc:element/doc:field[@name='value']">    
    <creator><xsl:value-of select="." /></creator>    
</xsl:for-each>

我明白了:

<creator>Pavel Hitch</creator>
<creator>Adan Riviera</creator>

我想做的是看起来像这样:

<creators>
    <creator>Pavel Hitch</creator>
    <creator>Adan Riviera</creator>
</creators>

编辑:我的问题是,当我只获得一个值时,将&#34;创建者标记&#34;只有,但是返回了两个以上的值,添加&#34;创建者&#34;家长。

我试过保存&#34; foreach&#34;输出到一个变量,使用position()和last()来制作一些条件,但是&#34;创建者&#34;标记只是重复自己(感谢te foreach),尝试这给我一些关键标记错误:

xsl:for-each select="doc:metadata/doc:element[@name='dc']/doc:element[@name='date']/doc:element[@name='dateType']/doc:element/doc:field[@name='value']">
<xsl:variable name="lastPos" select="last()"/>
<xsl:variable name="initPos" select="position()"/>      

<xsl:if test="$lastPos>'1' and $initPos='1' ">
    <Creators>
</xsl:if>
    <creator><xsl:value-of select="." /></creator>
<xsl:if test="$lastPos = $initPos">
    </Creators>
</xsl:if>
</xsl:for-each>

我希望你能帮助我,我真的是新手。

谢谢! :)

1 个答案:

答案 0 :(得分:1)

问题是,<creators>标记/元素属于for-each循环的,以便在有多个元素时将其包围起来。

  

当我只得到一个值时,请输入&#34;创建者标记&#34;只有,但是返回了两个以上的值,添加&#34;创建者&#34;家长。

所以这可以使用xsl:choose来解决,<xsl:choose> <xsl:when test="count(doc:metadata/doc:element[@name='dc']/doc:element[@name='date']/doc:element[@name='dateType']/doc:element/doc:field[@name='value']) > 1"> <creators> <xsl:for-each select="doc:metadata/doc:element[@name='dc']/doc:element[@name='date']/doc:element[@name='dateType']/doc:element/doc:field[@name='value']"> <creator><xsl:value-of select="." /></creator> </xsl:for-each> </creators> </xsl:when> <xsl:otherwise> <xsl:for-each select="doc:metadata/doc:element[@name='dc']/doc:element[@name='date']/doc:element[@name='dateType']/doc:element/doc:field[@name='value']"> <creator><xsl:value-of select="." /></creator> </xsl:for-each> </xsl:otherwise> </xsl:choose> 计算这两种情况之间不同的元素:

xsl:for-each

第二种情况下的head可能是多余的,但它会解决没有创作者的(理论上)可能性。