我正在学习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>
我希望你能帮助我,我真的是新手。
谢谢! :)
答案 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
可能是多余的,但它会解决没有创作者的(理论上)可能性。