xslt max函数用于查找最大值

时间:2017-04-04 16:28:47

标签: xslt

我正在使用xslt max函数来查找给定序列值的最大值。

的xmlns:FN =" HTTP://www.w3.org/2005/xpath-functions"

<xsl:variable name="max" select="fn:max(2,4,1)"/>

使用xslt1.0,2.0累了。它不起作用。任何帮助表示赞赏。

感谢。

2 个答案:

答案 0 :(得分:2)

在XSLT 2.0中,表达式为:

max((2,4,1))

将返回4.

注意使(单个)参数成为序列的内部括号。没有它们,你将有3个参数 - 这不是这个函数的有效语法。

答案 1 :(得分:0)

如果您使用的是Microsoft的XSLT引擎(即XslCompiledTransform),您可以使用内联脚本创建最大功能。

<强> XSLT

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet 
    version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:msxsl="urn:schemas-microsoft-com:xslt"
    xmlns:monkey="urn:JohnLBevan/Xslt2.0/MonkeyPatch"
    exclude-result-prefixes="xsl msxsl"
>
    <xsl:output method="xml" indent="yes" version="1.0"/>
    <xsl:strip-space elements="*"/>

    <!-- \this is our call to the max function\ -->
    <xsl:variable name="max" select="monkey:max(2,4)"/>
    <!-- /this is our call to the max function/ -->

    <!-- match any xml file and stick our max value in the root element -->
    <xsl:template match="/*">
        <xsl:element name='{name(.)}' namespace="{namespace-uri(.)>
            <xsl:value-of select="$max" />
        </xsl:element>
    </xsl:template>

    <!-- \this is our max function definition\ -->
    <msxsl:script language="C#" implements-prefix="monkey">
        <![CDATA[
        public static long max(long a, long b)
        {
            return a > b ? a: b;
        }
        ]]>
    </msxsl:script>
    <!-- /this is our max function definition/ -->

</xsl:stylesheet>

示例调用(PowerShell)

    $XsltFilename = '.\MyXslt.xsl'
    $Path = '.\MyData.xml'

    Add-Type -AssemblyName 'System.Xml'
    $xslt = New-Object 'System.Xml.Xsl.XslCompiledTransform'
    $settings = New-Object 'System.Xml.Xsl.XsltSettings'
    $settings.EnableScript = $true;
    $xslt.Load($XsltFilename, $settings, (New-Object 'System.Xml.XmlUrlResolver'))
    $xslt.Transform($Path, "$Path.out.xml")

示例通话(C#)

using System.Xml;
using System.Xml.Xsl;
public class XmlDemo 
{
    public static void TransformXml(string xsltFilename, string xmlFilename) 
    {
        XslCompiledTransform xslt = New XslCompiledTransform();
        XsltSettings settings = new XsltSettings();
        settings.EnableScript = true;
        xslt.Load(xsltFilename, settings, new XmlUrlResolver());
        xslt.Transform(xmlFilename, xmlFilename + ".out.xml")
    }
}

遗憾的是,这些脚本无法识别IComparable或params,因此以下选项虽然更灵活/更有用,但无效:

IComparable(无效)

    <msxsl:script language="C#" implements-prefix="monkey">
        <![CDATA[
        public static IComparable max(IComparable a, IComparable b)
        {
            return a.CompareTo(b) >=0 ? a: b;
        }
        ]]>
    </msxsl:script>

参与(无效)

    <msxsl:script language="C#" implements-prefix="monkey">
        <msxsl:assembly name="System.Core" />
        <msxsl:using namespace="System.Linq" />
        <![CDATA[
        public static object max (params object[] args)
        {
            return args.Max(); //IEnumerable.Max from Linq
        }
        ]]>
    </msxsl:script>