获取节点的最后一个值

时间:2013-06-13 21:20:30

标签: xslt xslt-2.0

我正在尝试获取属于某个组的节点的最后一个值。

给出以下XML -

 <books>
 <author>
    <name>R.R.</name>
    <titles>
          <titlename>North</titlename>
          <titlename>King</titilename>
    </titles>
 </author>
 <author>
    <name>R.L.</name>
    <titles>
          <titlename>Dragon</titlename>
          <titlename>Wild</titilename>
    </titles>
</author>
</books>

我认为它会像 -

 <template match="/">
      <for-each-group select="books/author" group-by="name">
      <lastTitle>
           <name><xsl:value-of select="name"/></name>
           <title><xsl:value-of select="last()/name"/></title>
      </lastTitle
      </for-each-group>
  <template>

因此结果将是 -

 <lastTitle>
      <name>R.R</name>
      <title>King</title> 
 </lastTitle>
 <lastTitle>
      <name>R.L.</name>
      <title>Wild</title> 
 </lastTitle>

我如何产生这个结果?

1 个答案:

答案 0 :(得分:2)

而不是这样做

<xsl:value-of select="last()/name"/>

您正在寻找的表达方式是:

<xsl:value-of select="titles/titlename[last()]"/>

然而,值得指出的是,这不是一个真正的“分组”问题。 (如果您有两个不同的 author 元素具有相同的名称,那么这只会是一个分组问题)。实际上你可以在这里使用一个简单的 xsl:for-each

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
   <xsl:output method="xml" indent="yes"/>

   <xsl:template match="/">
      <xsl:for-each select="books/author">
         <lastTitle>
            <name>
               <xsl:value-of select="name"/>
            </name>
            <title>
               <xsl:value-of select="titles/titlename[last()]"/>
            </title>
         </lastTitle>
      </xsl:for-each>
   </xsl:template>
</xsl:stylesheet>