2017-04-04 192 views
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。它不工作。任何幫助表示讚賞。

謝謝。

+0

不要告訴我們這是行不通的,告訴我們如何失敗。如果您告訴我們,我們可能會告訴您,原因是您使用的是XSLT 1.0處理器。實際上,我們只能猜測這就是解釋,因爲許多人認爲在他們的樣式表中編寫version =「2.0」的錯誤會讓他們古老的XSLT處理器理解XSLT 2.0。 –

回答

1

在XSLT 2.0,表達式:

max((2,4,1)) 

將返回4.

注意括號內,使該(單一的)參數的序列。沒有它們,你會有3個參數 - 這不是這個函數的有效語法。

+0

我試過使用最大((2,4,1)),不工作。檢查我們是否在我使用的工具中支持2.0。或者,我們在xslt 1.0中有沒有類似的功能? – techq

+0

不,在XSLT 1.0中,您需要對它們進行排序並取最後一個(或第一個)。如果無法使用,請發佈[mcve]。 –

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的或參數,可以讓下面的選項,同時又是更靈活的/有用的,是無效的:

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>