2012-10-10 46 views
1

我需要編寫一個XPath來獲取具有最大年份的子元素的名稱。XPath根據屬性獲取最大子元素

這是我的XSLT得到它,但問題是,我不知何故需要調用一個模板,將年份格式化爲數字第一。

<xsl:value-of select="reports/report[not(preceding-sibling::report/@year &gt;= @year) 
and not(following-sibling::report/@year &gt; @year)]/name" /> 

示例XML:

<reports> 
    <report year="2012 Q4"> 
    <name>X</name> 
    </report> 
    <report year="2011 Q4"> 
    <name>Y</name> 
    </company> 
</reports> 

預期輸出:X.

回答

0

只要包裝每個比較表達成substring-before(... , ' ')

0

下面是另一種方法,其仍然包含的代碼以提取年數,但避免了長併發症同級檢查

<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="reports/report"> 
     <xsl:sort select="substring-before(@year, ' ')" data-type="number" order="descending" /> 
     <xsl:if test="position() = 1"> 
      <xsl:value-of select="name" /> 
     </xsl:if> 
     </xsl:for-each> 
    </xsl:template> 
</xsl:stylesheet> 

的方法是簡單地在順序中的元素進行排序,但只輸出的值爲第一個。

當示例XML使用,輸出應該是X

+0

,如果有什麼需要@year更多的格式?我怎麼能在選擇內部調用模板?在xstl 1.0中 – jlp

+0

您不能在select中調用模板,您必須使用xpath函數或可能的擴展函數。這取決於你想要做什麼樣的格式,但如果我們能夠提供幫助,你確實需要展示更合適的樣本。謝謝。 –

+0

我不知道格式化函數的實現,但我想知道如何調用模板/函數/無論從該代碼 – jlp