我需要编写一个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 :(得分: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