在 XSLT 1.0 中的变量中使用 max

发布于 2024-10-24 00:31:59 字数 1835 浏览 1 评论 0原文

我可以在 XSLT 1 的变量中使用 max 函数吗? 我需要在某些节点内找到最大值,并且需要从更多地方调用它。 所以我尝试创建一个模板:

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:msxsl="urn:schemas-microsoft-com:xslt"
 xmlns:essox="urn:essox-scripts">
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
    <xsl:template name="Field001_max_dluznych_splatek">
        <xsl:param name="CrRep"/>
        <xsl:variable name="PocetDluznychSplatekSplatky">
            <xsl:value-of
             select="max($CrRep
                         /Response
                          /ContractData
                           /Installments
                            /InstDetail
                             /NrOfDueInstalments)" />
        </xsl:variable>
        <xsl:variable name="PocetDluznychSplatekKarty">
            <xsl:value-of
             select="max($CrRep
                          /Response
                           /ContractData
                            /Cards
                             /CardDetail
                              /NrOfDueInstalments)" />
        </xsl:variable>
        <xsl:choose>
            <xsl:when test="$PocetDluznychSplatekSplatky
                             &gt;= $PocetDluznychSplatekKarty">
                <xsl:value-of select="$PocetDluznychSplatekSplatky"/>
            </xsl:when>
            <xsl:otherwise>
                <xsl:value-of select="$PocetDluznychSplatekKarty"/>
            </xsl:otherwise>
        </xsl:choose>
    </xsl:template>
</xsl:stylesheet>

在 XML Spy 中我收到此错误:

XPath 表达式中的错误未知 功能 - 名称和数量 参数与任何函数都不匹配 静态上下文中的签名 - '最大'。

出了什么问题? 多谢, 彼得

can I use max function in a variable in XSLT 1?
I need to find a maximum value inside some nodes and I'll need to call this from more places.
So I tried to create a template:

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:msxsl="urn:schemas-microsoft-com:xslt"
 xmlns:essox="urn:essox-scripts">
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
    <xsl:template name="Field001_max_dluznych_splatek">
        <xsl:param name="CrRep"/>
        <xsl:variable name="PocetDluznychSplatekSplatky">
            <xsl:value-of
             select="max($CrRep
                         /Response
                          /ContractData
                           /Installments
                            /InstDetail
                             /NrOfDueInstalments)" />
        </xsl:variable>
        <xsl:variable name="PocetDluznychSplatekKarty">
            <xsl:value-of
             select="max($CrRep
                          /Response
                           /ContractData
                            /Cards
                             /CardDetail
                              /NrOfDueInstalments)" />
        </xsl:variable>
        <xsl:choose>
            <xsl:when test="$PocetDluznychSplatekSplatky
                             >= $PocetDluznychSplatekKarty">
                <xsl:value-of select="$PocetDluznychSplatekSplatky"/>
            </xsl:when>
            <xsl:otherwise>
                <xsl:value-of select="$PocetDluznychSplatekKarty"/>
            </xsl:otherwise>
        </xsl:choose>
    </xsl:template>
</xsl:stylesheet>

In XML Spy I get this error:

Error in XPath expression Unknown
function - Name and number of
arguments do not match any function
signature in the static context -
'max'.

What is wrong?
Thanks a lot,
Peter

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

像你 2024-10-31 00:31:59

使用众所周知的最大惯用语:

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:msxsl="urn:schemas-microsoft-com:xslt"
 xmlns:essox="urn:essox-scripts">
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
    <xsl:template name="Field001_max_dluznych_splatek">
        <xsl:param name="CrRep"/>
        <xsl:variable name="PocetDluznychSplatekSplatky">
            <xsl:call-template name="maximun">
                <xsl:with-param name="pSequence"
                 select="$CrRep
                          /Response
                           /ContractData
                            /Installments
                             /InstDetail
                              /NrOfDueInstalments"/>
            </xsl:call-template>
        </xsl:variable>
        <xsl:variable name="PocetDluznychSplatekSplatky">
            <xsl:call-template name="maximun">
                <xsl:with-param name="pSequence"
                 select="$CrRep
                          /Response
                           /ContractData
                            /Cards
                             /CardDetail
                              /NrOfDueInstalments"/>
            </xsl:call-template>
        </xsl:variable>
        <xsl:choose>
            <xsl:when test="$PocetDluznychSplatekSplatky
                             >= $PocetDluznychSplatekKarty">
                <xsl:value-of select="$PocetDluznychSplatekSplatky"/>
            </xsl:when>
            <xsl:otherwise>
                <xsl:value-of select="$PocetDluznychSplatekKarty"/>
            </xsl:otherwise>
        </xsl:choose>
    </xsl:template>
    <xsl:template name="maximun">
        <xsl:param name="pSequence"/>
        <xsl:for-each select="$pSequence">
            <xsl:sort select="." data-type="number" order="descending"/>
            <xsl:if test="position()=1">
                <xsl:value-of select="."/>
            </xsl:if>
        </xsl:for-each>
    </xsl:template>
</xsl:stylesheet>

注意:在命名模板中以便重用。

Use the well known maximum idiom:

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:msxsl="urn:schemas-microsoft-com:xslt"
 xmlns:essox="urn:essox-scripts">
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
    <xsl:template name="Field001_max_dluznych_splatek">
        <xsl:param name="CrRep"/>
        <xsl:variable name="PocetDluznychSplatekSplatky">
            <xsl:call-template name="maximun">
                <xsl:with-param name="pSequence"
                 select="$CrRep
                          /Response
                           /ContractData
                            /Installments
                             /InstDetail
                              /NrOfDueInstalments"/>
            </xsl:call-template>
        </xsl:variable>
        <xsl:variable name="PocetDluznychSplatekSplatky">
            <xsl:call-template name="maximun">
                <xsl:with-param name="pSequence"
                 select="$CrRep
                          /Response
                           /ContractData
                            /Cards
                             /CardDetail
                              /NrOfDueInstalments"/>
            </xsl:call-template>
        </xsl:variable>
        <xsl:choose>
            <xsl:when test="$PocetDluznychSplatekSplatky
                             >= $PocetDluznychSplatekKarty">
                <xsl:value-of select="$PocetDluznychSplatekSplatky"/>
            </xsl:when>
            <xsl:otherwise>
                <xsl:value-of select="$PocetDluznychSplatekKarty"/>
            </xsl:otherwise>
        </xsl:choose>
    </xsl:template>
    <xsl:template name="maximun">
        <xsl:param name="pSequence"/>
        <xsl:for-each select="$pSequence">
            <xsl:sort select="." data-type="number" order="descending"/>
            <xsl:if test="position()=1">
                <xsl:value-of select="."/>
            </xsl:if>
        </xsl:for-each>
    </xsl:template>
</xsl:stylesheet>

Note: In a named template for reuse.

哎呦我呸! 2024-10-31 00:31:59

XSLT 1.0 中没有 max 函数。您可以通过按降序对元素进行排序然后获取第一个元素的值来解决此问题。

这是另一种(较慢)的方法:

<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:variable name="PocetDluznychSplatekSplatky"
        select="/test/PocetDluznychSplatekSplatky/val[not(../val > .)][1]" />
    <xsl:variable name="PocetDluznychSplatekKarty"
        select="/test/PocetDluznychSplatekKarty/val[not(../val > .)][1]" />
    <xsl:template match="/">
        <xsl:choose>
            <xsl:when
                test="$PocetDluznychSplatekSplatky >= 
                      $PocetDluznychSplatekKarty">
                <xsl:value-of select="$PocetDluznychSplatekSplatky" />
            </xsl:when>
            <xsl:otherwise>
                <xsl:value-of select="$PocetDluznychSplatekKarty" />
            </xsl:otherwise>
        </xsl:choose>
    </xsl:template>
</xsl:stylesheet>

示例源文档:

<test>
    <PocetDluznychSplatekSplatky>
        <val>22</val>
        <val>3241</val>
        <val>13</val>
    </PocetDluznychSplatekSplatky>
    <PocetDluznychSplatekKarty>
        <val>1</val>
        <val>3234341</val>
        <val>13</val>
    </PocetDluznychSplatekKarty>
</test>

输出:

3234341

每个变量的 select 中的 XPath 如下所示:

/test/PocetDluznychSplatekSplatky/val[not(../val > .)][1]

或者,选择没有 val 元素>val 具有更大值(即最大值)的同级。

(显然,您需要调整 XPath 以适合您的源文档。)

注意: sort 解决方案的性能要好得多(假设 n*log( n) 排序实现)。第二种方法需要将每个 val 与其每一个同级进行比较,因此是二次的。

There is no max function in XSLT 1.0. You can work around this by sorting your elements in descending order and then taking the value of the first one.

Here's another (slower) way to do it:

<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:variable name="PocetDluznychSplatekSplatky"
        select="/test/PocetDluznychSplatekSplatky/val[not(../val > .)][1]" />
    <xsl:variable name="PocetDluznychSplatekKarty"
        select="/test/PocetDluznychSplatekKarty/val[not(../val > .)][1]" />
    <xsl:template match="/">
        <xsl:choose>
            <xsl:when
                test="$PocetDluznychSplatekSplatky >= 
                      $PocetDluznychSplatekKarty">
                <xsl:value-of select="$PocetDluznychSplatekSplatky" />
            </xsl:when>
            <xsl:otherwise>
                <xsl:value-of select="$PocetDluznychSplatekKarty" />
            </xsl:otherwise>
        </xsl:choose>
    </xsl:template>
</xsl:stylesheet>

Sample source document:

<test>
    <PocetDluznychSplatekSplatky>
        <val>22</val>
        <val>3241</val>
        <val>13</val>
    </PocetDluznychSplatekSplatky>
    <PocetDluznychSplatekKarty>
        <val>1</val>
        <val>3234341</val>
        <val>13</val>
    </PocetDluznychSplatekKarty>
</test>

Output:

3234341

The XPath in each variable's select looks like this:

/test/PocetDluznychSplatekSplatky/val[not(../val > .)][1]

Or, select the val element having no val siblings with a greater value (i.e. the max).

(Obviously, you'll need to adjust the XPath to fit your source document.)

Note: The sort solution performs much better (assuming an n*log(n) sort implementation). The second approach needs to compare each val to every one of its siblings and is therefore quadratic.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文