2013-04-27 59 views
1

我需要編寫一個將一系列節點轉換爲一系列字符串的XSLT函數。我需要做的是將函數應用於序列中的所有節點,並返回與原始序列相同的序列。如何將函數應用於XSLT中的節點序列

這是輸入文件

<article id="4"> 
    <author ref="#Guy1"/> 
    <author ref="#Guy2"/> 
</article> 

這是怎麼調用網站:

<xsl:template match="article"> 
    <xsl:text>Author for </xsl:text> 
    <xsl:value-of select="@id"/> 

    <xsl:variable name="names" select="func:author-names(.)"/> 

    <xsl:value-of select="string-join($names, ' and ')"/> 
    <xsl:value-of select="count($names)"/> 
</xsl:function> 

這是函數的代碼:

<xsl:function name="func:authors-names"> 
    <xsl:param name="article"/> 

    <!-- HELP: this is where I call `func:format-name` on 
     each `$article/author` element --> 
</xsl:function> 

我應該使用什麼裏面有func:author-names?我嘗試使用xsl:for-each,但結果是單個節點,而不是一個序列。

+0

請爲期望的輸出添加一個示例。 – 2013-04-27 10:41:36

+0

令人困惑的是,在想要「將函數應用於節點序列」的問題的標題中,但是在您的代碼中,您正在使用爲單個節點的參數值調用該函數。另外令人困惑的事實是,你沒有指定參數的類型和函數的返回類型。這使得這個問題很難理解。我總是建議任何開始使用XSLT的人總是指定類型:變量,函數參數,模板參數和全局參數,以及模板輸出的類型。 – 2013-04-27 16:00:27

回答

7

<xsl:sequence select="$article/author/func:format-name(.)"/>是一種方式,另一種是<xsl:sequence select="for $a in $article/author return func:format-name($a)"/>

我不知道你當然需要的功能,在article模板應該做的做

<xsl:value-of select="author/func:format-name(.)" separator=" and "/> 

+0

如果轉換比簡單的函數調用更復雜會怎麼樣? – gioele 2013-04-27 11:36:56

+1

我認爲你的問題「如何將一個函數應用到一系列節點」已經​​得到解答。如果您需要更復雜的內容和更復雜的輸出幫助,最好提出一個新問題,它清楚地描述了您對函數的輸入類型以及您想要的函數結果的類型。有一些方法可以將函數結果構造爲函數體中的一個序列,並且可以與函數中的'as'屬性進行交互,但在評論中很難對此進行詳細說明。問一個新的問題的細節,我相信我們可以提供幫助。 – 2013-04-27 11:45:06

0

如果只生成一系列@ref值,則不需要函數或xsl 2.0版。

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

    <xsl:template match="article"> 
     <xsl:apply-templates select="author" /> 
    </xsl:template> 
    <xsl:template match="author"> 
     <xsl:value-of select="@ref"/> 
     <xsl:if test="position() !=last()" > 
      <xsl:text>,</xsl:text> 
     </xsl:if> 
    </xsl:template> 
</xsl:styleshee 

這將產生:

#Guy1,#Guy2 

更新: 確有串由and加入,有一個項目的計數。試試這個:

<xsl:template match="article"> 
    <xsl:text>Author for </xsl:text> 
    <xsl:value-of select="@id"/> 

    <xsl:apply-templates select="author" /> 

    <xsl:value-of select="count(authr[@ref])"/> 
</xsl:template> 
<xsl:template match="author"> 
    <xsl:value-of select="@ref"/> 
    <xsl:if test="position() !=last()" > 
     <xsl:text> and </xsl:text> 
    </xsl:if> 
</xsl:template> 

有了這個輸出:

Author for 4#Guy1 and #Guy20