2017-04-04 29 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を使用。動いていない。どんな助けもありがとうございます。

ありがとうございました。 XSLT 2.0で

+0

それが失敗したかを教え、それは動作しませんを教えないでください。 XSLT 1.0プロセッサを使用している理由がわかっているかもしれません。つまり、スタイルシートにversion = "2.0"を書くと、古代のXSLTプロセッサが魔法のようにXSLT 2.0を理解できるようになってしまうという誤った考え方に基づいています。 –

答えて

1

、式:

max((2,4,1)) 

は(単一)の引数の配列を作るインナー括弧注4

を返します。それらがなければ、3つの引数があります - これはこの関数の有効な構文ではありません。

+0

max((2,4,1))を使ってみましたが、動作しませんでした。使用しているツールで2.0のサポートがあるかどうかを確認します。あるいは、xslt 1.0で同様の機能を利用できますか? – techq

+0

いいえ、XSLT 1.0では、それらをソートして最後(または最初)を取る必要があります。あなたがそれを動作させることができない場合は、[mcve]を投稿してください。 –

0

MicrosoftのXSLTエンジン(つまり、XslCompiledTransform)を使用している場合は、インラインスクリプトを使用してmax関数を作成できます。

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> 

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> 
関連する問題