2

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

4

2 回答 2

8

<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应该做的模板中。

于 2013-04-27T10:55:44.577 回答
1

如果只应生成一系列@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
于 2013-04-27T10:51:04.060 回答