我正在使用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累了。它不起作用。任何帮助表示赞赏。
感谢。
答案 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>