需要在 XSLT 1.0 中创建一个带参数的函数

问题描述 投票:0回答:1

在创建带参数的函数时需要一些帮助,并且可以在我的模板中使用该函数。尝试了很多事情但没有任何结果。以下是我的示例代码:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    version="1.0"
    xmlns:math="http://exslt.org/math"
    xmlns:func="http://exslt.org/functions"
    xmlns:my="http://exslt.org/my"
    exclude-result-prefixes="my"
    extension-element-prefixes="my math func">
    <xsl:output indent="yes" method="xml" />

    
    <xsl:variable name="functionTest11"> 
      <xsl:value-of select="my:calXY('aa')" />
    </xsl:variable>
    
    <xsl:template match="/">

        <svg xmlns="http://www.w3.org/2000/svg">
            <xsl:variable name="functionTest22"> 
                <xsl:value-of select="my:calXY" />
            </xsl:variable>
            <xsl:comment>functionTest <xsl:copy-of
              select="$functionTest22" /></xsl:comment>
        </svg>

    </xsl:template>
    
    <func:function name="my:calXY">
        <xsl:comment>functionHello </xsl:comment>
        <xsl:param name="string1" select="''"/>
        <func:result>
            <xsl:value-of select="concat(10,'|',10)" />
        </func:result>
    </func:function>
</xsl:stylesheet>

xslt-1.0 exslt
1个回答
5
投票

我无法方便地访问(据我所知)Xalan,它似乎是您正在使用的 XSLT 处理器。所以我无法测试有关您问题根源的任何猜想。

但是,如果在第一个(也是唯一的)

xsl:comment
之前放置像
xsl:param
这样的输出指令是正确的,我会大吃一惊。 (令我惊讶的是,您没有报告来自样式表编译器的任何错误消息。但是从您引用的错误消息中可以清楚地看出,Xalan 尚未成功编译该函数。)尚不清楚您想要通过让函数来完成什么返回注释节点和字符串值“10|10”,但这可能不是实现它的方法。

假设

xsl:comment
指令试图验证该函数实际上已被评估,我会尝试类似的事情

<func:function name="my:calXY">
    <xsl:param name="string1" select="''"/>
    <func:result select="concat(10,'|',10)" />
</

[在这个答案的早期版本中,我推测这里不需要

func:result
;我的错误。看来确实需要。]


您要求提供完整的样式表。使用 xsltproc 运行时,以下样式表按预期运行。 (正如我上面指出的,我没有便捷的方法来运行 Xalan。)

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    version="1.0"
    xmlns:func="http://exslt.org/functions"
    xmlns:my="http://example.org/my"
    exclude-result-prefixes="my"
    extension-element-prefixes="func">
  <xsl:output indent="yes" method="xml" />

  <xsl:template match="/">
    <xsl:message>Result is <xsl:value-of select="my:dummy('foo')"/></xsl:message>
    <output>
      <test><xsl:value-of select="my:dummy('bar')"/></test>
      <test><xsl:value-of select="my:dummy('baz')"/></test>
    </output>    
  </xsl:template>

  <func:function name="my:dummy">
    <xsl:param name="s" select="'foo'"/>
    <func:result select="concat($s,'|',$s)" />
  </func:function>

</xsl:stylesheet>
© www.soinside.com 2019 - 2024. All rights reserved.