Функция XPath и min не распознается в xslt

<td class="num">
                                        <xsl:if test="min(//vrednostDelnice)=trgovalniPodatki/vrednostDelnice">
                                            <xsl:attribute name="class">red</xsl:attribute>
                                        </xsl:if>
                                        <xsl:if test="max(//vrednostDelnice)=trgovalniPodatki/vrednostDelnice">
                                            <xsl:attribute name="class">green</xsl:attribute>
                                        </xsl:if>
                                        <xsl:value-of select="format-number(trgovalniPodatki/vrednostDelnice, '#.###,00 €', 'euro')"/>
                                    </td>

но я получаю

This document had an invalid XSLT stylesheet. Error message from the XSLT engine:
Error: XPath expression compilation failed: min(//vrednostDelnice)=trgovalniPodatki/vrednostDelnice
Details: compilation error (characters 1-22, "min(//vrednostDelnice)"): unknown function called: 'min'

Почему мин не распознается. Мин. допустимая функция: http://www.xsltfunctions.com/xsl/fn_min.html

РЕДАКТИРОВАТЬ:

XSL:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    xmlns:fn="http://www.w3.org/2005/xpath-functions">
    <xsl:output method="xhtml" version="1.0" encoding="UTF-8" indent="yes"/>

XML:

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="odlocitvenProblem.xsl"?>
<delnice xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:noNamespaceSchemaLocation="odlocitvenProblem.xsd">

весь xsl:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    xmlns:fn="http://www.w3.org/2005/xpath-functions">
    <xsl:output method="xhtml" version="1.0" encoding="UTF-8" indent="yes"/>
    <xsl:decimal-format name="euro" decimal-separator="," grouping-separator="."/>
    <xsl:variable name="kolicnik" select="'1000'"/>
    <xsl:key name="id" match="delnica" use="@id"/>
    <xsl:template match="/">
        <html>
            <head>
                <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
                <title>Delnice - seznam alternativ</title>
                <style type="text/css">
                    body {font: normal 12px/1.6em Arial, Helvetica, sans-serif;color: #2a3845;margin: 0;padding-left: 5px;padding-right: 5px; background: #FFFFFF; width: 100%; }
                    table { margin: 0;padding  0; border: 1px solid #efece7; margin: 0 auto; font : normal 12px/1.6em Arial, Helvetica, sans-serif;color: #2a3845; width: 100%; border-collapse: collapse; }
                    td { border: 1px solid #efece7; padding: 2px; }
                    th { border: 1px solid #efece7; padding: 2px; }
                    td.num { text-align: right;}
                    td.green { text-align: right; color: green;}
                    td.red { text-align: right; color: red;}
                    h1 { color: #7a2e40;margin: 0px 0px 10px 0px;padding-bottom: 10px;font: normal 17px Georgia, serif;border-bottom: 1px solid #efece7;}
                    #wrapper {margin: 0 auto;border-left: 1px solid #f0e9eb;border-right: 1px solid #f0e9eb;}
                    #header {margin: 0 0px; background: #7a2e40;color: #f6dde3; height: 30px;}
                    #main-content { margin: 0 auto; float: left; padding-top: 30px; padding-right: 10px; padding-bottom: 30px; padding-left: 10px;}
                    #footer {background: #f7f7f7; border-top: 1px solid #f0e9eb; border-bottom: 1px solid #f0e9eb; clear: both; height: 30px; }
                    tr.footer { font-size: 10px; vertical-align: top;}
                </style>
            </head>
            <body>
                <div id="wrapper">
                    <div id="header">&#160;</div>
                    <div id="main-content">
                        <h1>Delnice - seznam alternativ</h1>
                        <br/>
                        <table cellspacing="0">
                            <tr>
                                <th rowspan="2"></th>
                                <th rowspan="2">Naziv</th>
                                <th rowspan="2">Kratica</th>
                                <th rowspan="2">Vrednost delnice<br/>
(<xsl:value-of select="document('uteziParametrov.xml')/uteziDelnic/parameter[@naziv='vrednostDelnice']/@utez"/>)
                                </th>
                                <th colspan="3">Sprememba tečaja</th>
                                <th rowspan="2">Vrednost dividende<br/>
(<xsl:value-of select="document('uteziParametrov.xml')/uteziDelnic/parameter[@naziv='vrednostDividende']/@utez"/>)
                                </th>
                                <th rowspan="2">Dividendni donos<br/>
(<xsl:value-of select="document('uteziParametrov.xml')/uteziDelnic/parameter[@naziv='dividendniDonos']/@utez"/>)
                                </th>
                                <th rowspan="2">Promet<br/>
(<xsl:value-of select="document('uteziParametrov.xml')/uteziDelnic/parameter[@naziv='promet']/@utez"/>)
                                </th>
                                <th rowspan="2">Tržna kapitalizacija<br/>
(<xsl:value-of select="document('uteziParametrov.xml')/uteziDelnic/parameter[@naziv='trznaKapitalizacija']/@utez"/>) *
                                </th>
                                <th rowspan="2">Število delnic</th>
                                <th rowspan="2">Čisti dobiček<br/>
(<xsl:value-of select="document('uteziParametrov.xml')/uteziDelnic/parameter[@naziv='cistiDobicek']/@utez"/>) *
                                </th>
                                <th rowspan="2">Finančna sredstva<br/>
(<xsl:value-of select="document('uteziParametrov.xml')/uteziDelnic/parameter[@naziv='financnaSredstva']/@utez"/>) *
                                </th>
                            </tr>
                            <tr>
                                <th>Letna<br/>
(<xsl:value-of select="document('uteziParametrov.xml')/uteziDelnic/parameter[@naziv='zadnjeLeto']/@utez"/>)
                                </th>
                                <th>Mesečna<br/>
(<xsl:value-of select="document('uteziParametrov.xml')/uteziDelnic/parameter[@naziv='zadnjiMesec']/@utez"/>)
                                </th>
                                <th>Dnevna<br/>
(<xsl:value-of select="document('uteziParametrov.xml')/uteziDelnic/parameter[@naziv='zadnjiDan']/@utez"/>)
                                </th>
                            </tr>
                            <xsl:for-each select="/delnice/*">
                                <xsl:sort select="nazivDruzbe"/>
                                <xsl:call-template name="alternative">
                                    <xsl:with-param name="node" select="."/>
                                </xsl:call-template>
                            </xsl:for-each>
                            <tr class="footer">
                                <td></td>
                                <td></td>
                                <td></td>
                                <td><xsl:for-each select="document('uteziParametrov.xml')/uteziDelnic/parameter[@naziv='vrednostDelnice']/zalogaVrednosti">
                                    <xsl:value-of select="@ocena"/>:&#160;<xsl:value-of select="spMeja" /> - <xsl:value-of select="zgMeja" />
                                    <br/>
                                </xsl:for-each></td>
                                <td><xsl:for-each select="document('uteziParametrov.xml')/uteziDelnic/parameter[@naziv='zadnjeLeto']/zalogaVrednosti">
                                    <xsl:value-of select="@ocena"/>:&#160;<xsl:value-of select="spMeja" /> - <xsl:value-of select="zgMeja" />
                                    <br/>
                                </xsl:for-each></td>
                                <td><xsl:for-each select="document('uteziParametrov.xml')/uteziDelnic/parameter[@naziv='zadnjiMesec']/zalogaVrednosti">
                                    <xsl:value-of select="@ocena"/>:&#160;<xsl:value-of select="spMeja" /> - <xsl:value-of select="zgMeja" />
                                    <br/>
                                </xsl:for-each></td>
                                <td><xsl:for-each select="document('uteziParametrov.xml')/uteziDelnic/parameter[@naziv='zadnjiDan']/zalogaVrednosti">
                                    <xsl:value-of select="@ocena"/>:&#160;<xsl:value-of select="spMeja" /> - <xsl:value-of select="zgMeja" />
                                    <br/>
                                </xsl:for-each></td>
                                <td><xsl:for-each select="document('uteziParametrov.xml')/uteziDelnic/parameter[@naziv='vrednostDividende']/zalogaVrednosti">
                                    <xsl:value-of select="@ocena"/>:&#160;<xsl:value-of select="spMeja" /> - <xsl:value-of select="zgMeja" />
                                    <br/>
                                </xsl:for-each></td>
                                <td><xsl:for-each select="document('uteziParametrov.xml')/uteziDelnic/parameter[@naziv='dividendniDonos']/zalogaVrednosti">
                                    <xsl:value-of select="@ocena"/>:&#160;<xsl:value-of select="spMeja" /> - <xsl:value-of select="zgMeja" />
                                    <br/>
                                </xsl:for-each></td>
                                <td><xsl:for-each select="document('uteziParametrov.xml')/uteziDelnic/parameter[@naziv='promet']/zalogaVrednosti">
                                    <xsl:value-of select="@ocena"/>:&#160;<xsl:value-of select="spMeja" /> - <xsl:value-of select="zgMeja" />
                                    <br/>
                                </xsl:for-each></td>
                                <td><xsl:for-each select="document('uteziParametrov.xml')/uteziDelnic/parameter[@naziv='trznaKapitalizacija']/zalogaVrednosti">
                                    <xsl:value-of select="@ocena"/>:&#160;<xsl:value-of select="spMeja div number($kolicnik)" /> - <xsl:value-of select="zgMeja div 1000" />
                                    <br/>
                                </xsl:for-each></td>
                                <td></td>
                                <td><xsl:for-each select="document('uteziParametrov.xml')/uteziDelnic/parameter[@naziv='cistiDobicek']/zalogaVrednosti">
                                    <xsl:value-of select="@ocena"/>:&#160;<xsl:value-of select="spMeja div number($kolicnik)" /> - <xsl:value-of select="zgMeja div 1000" />
                                    <br/>
                                </xsl:for-each></td>
                                <td><xsl:for-each select="document('uteziParametrov.xml')/uteziDelnic/parameter[@naziv='financnaSredstva']/zalogaVrednosti">
                                    <xsl:value-of select="@ocena"/>:&#160;<xsl:value-of select="spMeja div number($kolicnik)" /> - <xsl:value-of select="zgMeja div 1000" />
                                    <br/>
                                </xsl:for-each></td>
                            </tr>
                        </table>
                        <span style="font-size: 80%;">* v <xsl:value-of select="$kolicnik"/></span>
                    </div>
                    <div id="footer">&#160;</div>
                </div>
            </body>
        </html>
    </xsl:template>

    <xsl:template name="alternative">
        <xsl:param name="node"/>
            <tr>
                <td>
                    <xsl:number value="position()" format="1" />
                </td>
                <td>
                    <xsl:value-of select="$node/nazivDruzbe"/>
                </td>
                <td>
                    <xsl:value-of select="kratica"/>
                </td>
                                    <td class="num">
                                        <xsl:if test="fn:min(//vrednostDelnice)=trgovalniPodatki/vrednostDelnice">
                                            <xsl:attribute name="class">red</xsl:attribute>
                                        </xsl:if>
                                        <xsl:if test="max(//vrednostDelnice)=trgovalniPodatki/vrednostDelnice">
                                            <xsl:attribute name="class">green</xsl:attribute>
                                        </xsl:if>
                                        <xsl:value-of select="format-number(trgovalniPodatki/vrednostDelnice, '#.###,00 €', 'euro')"/>
                                    </td>
                                    <td class="num">
                                        <xsl:if test="min(//zadnjeLeto)=trgovalniPodatki/spremembaTecaja/zadnjeLeto">
                                            <xsl:attribute name="class">red</xsl:attribute>
                                        </xsl:if>
                                        <xsl:if test="max(//zadnjeLeto)=trgovalniPodatki/spremembaTecaja/zadnjeLeto">
                                            <xsl:attribute name="class">green</xsl:attribute>
                                        </xsl:if>
                                        <xsl:value-of select="trgovalniPodatki/spremembaTecaja/zadnjeLeto"/>%</td>
                                    <td class="num">
                                        <xsl:if test="min(//zadnjiMesec)=trgovalniPodatki/spremembaTecaja/zadnjiMesec">
                                            <xsl:attribute name="class">red</xsl:attribute>
                                        </xsl:if>
                                        <xsl:if test="max(//zadnjiMesec)=trgovalniPodatki/spremembaTecaja/zadnjiMesec">
                                            <xsl:attribute name="class">green</xsl:attribute>
                                        </xsl:if>
                                        <xsl:value-of select="trgovalniPodatki/spremembaTecaja/zadnjiMesec"/>%</td>
                                    <td class="num">
                                        <xsl:if test="min(//zadnjiDan)=trgovalniPodatki/spremembaTecaja/zadnjiDan">
                                            <xsl:attribute name="class">red</xsl:attribute>
                                        </xsl:if>
                                        <xsl:if test="max(//zadnjiDan)=trgovalniPodatki/spremembaTecaja/zadnjiDan">
                                            <xsl:attribute name="class">green</xsl:attribute>
                                        </xsl:if>
                                        <xsl:value-of select="trgovalniPodatki/spremembaTecaja/zadnjiDan"/>%</td>
                                    <td class="num">
                                        <xsl:if test="min(//vrednostDividende)=trgovalniPodatki/vrednostDividende">
                                            <xsl:attribute name="class">red</xsl:attribute>
                                        </xsl:if>
                                        <xsl:if test="max(//vrednostDividende)=trgovalniPodatki/vrednostDividende">
                                            <xsl:attribute name="class">green</xsl:attribute>
                                        </xsl:if>
                                        <xsl:value-of select="trgovalniPodatki/vrednostDividende"/>
                                    </td>
                                    <td class="num">
                                        <xsl:if test="min(//dividendniDonos)=trgovalniPodatki/dividendniDonos">
                                            <xsl:attribute name="class">red</xsl:attribute>
                                        </xsl:if>
                                        <xsl:if test="max(//dividendniDonos)=trgovalniPodatki/dividendniDonos">
                                            <xsl:attribute name="class">green</xsl:attribute>
                                        </xsl:if>
                                        <xsl:value-of select="trgovalniPodatki/dividendniDonos"/>%</td>
                                    <td class="num">
                                        <xsl:if test="min(//promet)=trgovalniPodatki/promet">
                                            <xsl:attribute name="class">red</xsl:attribute>
                                        </xsl:if>
                                        <xsl:if test="max(//promet)=trgovalniPodatki/promet">
                                            <xsl:attribute name="class">green</xsl:attribute>
                                        </xsl:if>
                                        <xsl:value-of select="trgovalniPodatki/promet"/>
                                    </td>
                                    <td class="num">
                                        <xsl:if test="min(//trznaKapitalizacija)=trgovalniPodatki/trznaKapitalizacija">
                                            <xsl:attribute name="class">red</xsl:attribute>
                                        </xsl:if>
                                        <xsl:if test="max(//trznaKapitalizacija)=trgovalniPodatki/trznaKapitalizacija">
                                            <xsl:attribute name="class">green</xsl:attribute>
                                        </xsl:if>
                                        <xsl:value-of select="format-number(trgovalniPodatki/trznaKapitalizacija div number($kolicnik), '###.###.###', 'euro')"/>
                                    </td>
                                    <td class="num">
                                        <xsl:value-of select="financniPodatki/steviloDelnic"/>
                                    </td>
                                    <td class="num">
                                        <xsl:if test="min(//cistiDobicek)=financniPodatki/cistiDobicek">
                                            <xsl:attribute name="class">red</xsl:attribute>
                                        </xsl:if>
                                        <xsl:if test="max(//cistiDobicek)=financniPodatki/cistiDobicek">
                                            <xsl:attribute name="class">green</xsl:attribute>
                                        </xsl:if>
                                        <xsl:value-of select="financniPodatki/cistiDobicek div number($kolicnik)"/>
                                    </td>
                                    <td class="num">
                                        <xsl:if test="min(//financnaSredstva)=financniPodatki/financnaSredstva">
                                            <xsl:attribute name="class">red</xsl:attribute>
                                        </xsl:if>
                                        <xsl:if test="max(//financnaSredstva)=financniPodatki/financnaSredstva">
                                            <xsl:attribute name="class">green</xsl:attribute>
                                        </xsl:if>
                                        <xsl:value-of select="financniPodatki/financnaSredstva div number($kolicnik)"/>
            </td>
        </tr>
    </xsl:template>
</xsl:stylesheet>

person senzacionale    schedule 27.07.2012    source источник
comment
Какую версию XSLT, по вашему мнению, вы используете? Какую версию XSLT, по мнению вашего процессора XSLT, вы используете?   -  person O. R. Mapper    schedule 27.07.2012
comment
попробуйте fn:min, поскольку вы используете функцию расширения   -  person Woody    schedule 27.07.2012
comment
То же самое: Детали: ошибка компиляции (символы 1-25, fn:min(//vrednostDelnice)): вызвана неизвестная функция: '{ w3.org/2005/xpath-functions, мин }'   -  person senzacionale    schedule 27.07.2012
comment
fn:min должно работать нормально. Можете ли вы опубликовать пример входного документа и немного больше таблицы стилей, чтобы мы могли проверить это сами? Возможно проблема в парсере. Какой инструмент/библиотеку вы используете? Возможно, это требует некоторой настройки.   -  person toniedzwiedz    schedule 27.07.2012
comment
я вставляю весь код xsl. Я использую altoca xml spy и notepad++ или xml. Смотрю через оперу, там ошибки вижу.   -  person senzacionale    schedule 27.07.2012


Ответы (2)


Функция min является частью XSLT и XPath 2.0 и таким образом поддерживается процессорами XSLT 2.0, такими как Saxon 9, AltovaXML или XmlPrime. Внутри браузера нет поддержки XSLT 2.0, если вы не используете Saxon-CE. Таким образом, ошибка, которую вы получаете, просто означает, что вы пытаетесь запустить код XSLT 2.0 с процессором XSLT 1.0.

person Martin Honnen    schedule 27.07.2012
comment
Спасибо за ответ. И что я могу сделать. У меня уже есть ‹xsl:stylesheet version=2.0 xmlns:xsl=w3.org/1999/XSL/ Преобразовать - person senzacionale; 27.07.2012
comment
Вам нужно использовать процессор XSLT 2.0, а не процессор XSLT 1.0. Я упомянул некоторые процессоры XSLT 2.0, такие как Saxon 9 saxon.sourceforge.net или AltovaXML altova.com/altovaxml.html. Поэтому установите и используйте один из них, если хотите использовать XSLT 2.0. - person Martin Honnen; 27.07.2012

Сказать, что ваша таблица стилей является таблицей стилей версии 2.0, не поможет, если процессор XSLT, который вы вызываете, понимает только XSLT 1.0. Я не узнаю сообщений об ошибках, которые вы получаете, и в вашем посте нет других подсказок относительно того, какой процессор XSLT вы используете, но, похоже, это процессор XSLT 1.0. Расскажите нам, как вы выполняете преобразование, например. из командной строки, из браузера или из приложения на каком-либо языке программирования.

person Michael Kay    schedule 27.07.2012