XSLT - 在新父级中对每个值进行分组
XSLT - Group foreach values inside new parent
我正在学习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>
编辑:我的问题是,当我只得到一个值时,只放置 "creator tag",但返回了两个以上的值,添加 "creators" 父级。
我尝试将 "foreach" 输出保存到一个变量中,使用 position() 和 last() 进行一些条件判断,但 "creators" 标签只是重复自身(感谢 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>
希望大家能帮帮我,我真的是新手
谢谢! :)
问题是 <creators>
tag/element 属于 for-each
循环的 外部 当有多个元素时包围它.
when I get just one value, put the "creator tag" only, but with two o more values returned, add the "creators" parent.
所以这可以使用 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
可能是多余的,但它考虑到了没有创作者的(理论上的)可能性。
我正在学习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>
编辑:我的问题是,当我只得到一个值时,只放置 "creator tag",但返回了两个以上的值,添加 "creators" 父级。
我尝试将 "foreach" 输出保存到一个变量中,使用 position() 和 last() 进行一些条件判断,但 "creators" 标签只是重复自身(感谢 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>
希望大家能帮帮我,我真的是新手
谢谢! :)
问题是 <creators>
tag/element 属于 for-each
循环的 外部 当有多个元素时包围它.
when I get just one value, put the "creator tag" only, but with two o more values returned, add the "creators" parent.
所以这可以使用 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
可能是多余的,但它考虑到了没有创作者的(理论上的)可能性。