如何将函数应用于XSLT中的节点序列

时间:2013-04-27 10:18:02

标签: xslt sequence xslt-2.0

我需要编写一个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,但结果是单个节点,而不是序列。

2 个答案:

答案 0 :(得分:7)

<xsl:sequence select="$article/author/func:format-name(.)"/>是单向的,另一种是<xsl:sequence select="for $a in $article/author return func:format-name($a)"/>

我不确定你当然需要这个功能吗

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

应该这样做。

答案 1 :(得分: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