我正在使用xslt max函數查找給定序列值的最大值。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。它不工作。任何幫助表示讚賞。
謝謝。
我正在使用xslt max函數查找給定序列值的最大值。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。它不工作。任何幫助表示讚賞。
謝謝。
在XSLT 2.0,表達式:
max((2,4,1))
將返回4.
注意括號內,使該(單一的)參數的序列。沒有它們,你會有3個參數 - 這不是這個函數的有效語法。
我試過使用最大((2,4,1)),不工作。檢查我們是否在我使用的工具中支持2.0。或者,我們在xslt 1.0中有沒有類似的功能? – techq
不,在XSLT 1.0中,您需要對它們進行排序並取最後一個(或第一個)。如果無法使用,請發佈[mcve]。 –
如果您使用的是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的或參數,可以讓下面的選項,同時又是更靈活的/有用的,是無效的:
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>
PARAMS(無效)
<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>
不要告訴我們這是行不通的,告訴我們如何失敗。如果您告訴我們,我們可能會告訴您,原因是您使用的是XSLT 1.0處理器。實際上,我們只能猜測這就是解釋,因爲許多人認爲在他們的樣式表中編寫version =「2.0」的錯誤會讓他們古老的XSLT處理器理解XSLT 2.0。 –