【问题标题】:XSLT - Group foreach values inside new parentXSLT - 在新父级中对 foreach 值进行分组
【发布时间】:2018-03-16 23:39:38
【问题描述】:

我正在学习 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>

编辑:我的问题是当我只得到一个值时,只放置“创建者标签”,但返回两个或更多值时,添加“创建者”父级。

我尝试将“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>

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

谢谢! :)

【问题讨论】:

    标签: xml xslt foreach dspace


    【解决方案1】:

    问题是&lt;creators&gt; 标签/元素属于for-each 循环的外部,当有多个元素时将其包围。

    当我只得到一个值时,只放置“创建者标签”,但返回两个或更多值时,添加“创建者”父级。

    所以这可以使用xsl:choose 来解决,该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 可能是多余的,但它处理了没有创建者的(理论上的)可能性。

    【讨论】:

    • 你是对的!我编辑我的问题,因为创建者节点取决于如果我在 foreach 上获得两个或更多值,:)
    • 非常感谢,有了选择和计数功能,我可以完成这个了。 ;)
    猜你喜欢
    • 2016-10-24
    • 1970-01-01
    • 2016-01-25
    • 2023-02-10
    • 1970-01-01
    • 1970-01-01
    • 2011-02-15
    • 1970-01-01
    • 2018-04-20
    相关资源
    最近更新 更多