2009-07-03 15 views
0

Aus unbekannten Gründen funktioniert max Funktion nicht.xpath-function max funktioniert nicht

XML-Eingabedatei:

test.xml

<?xml version="1.0" encoding="UTF-8"?> 
<numbers> 
    <number>3</number> 
    <number>5</number> 
    <number>10</number> 
    <number>1</number> 
</numbers> 

XSL Eingabedatei

Test.xsl

<?xml version="1.0"?> 
<xsl:stylesheet version="2.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:fn="http://www.w3.org/2005/02/xpath-functions" 
    xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance" > 

    <xsl:output method="xml" indent="yes" /> 
    <xsl:template match="/numbers"> 
     <numbers>  
      <xsl:value-of select="/numbers/number" />     

      fn:max(2, 3) 

     </numbers> 
    </xsl:template> 

</xsl:stylesheet> 

Output.xml

<?xml version="1.0" encoding="UTF-8"?> 

<numbers xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:fn="http://www.w3.org/2005/02/xpath-functions">3     

      fn:max(2, 3) 


     </numbers> 

Eingabedatei ist hier nicht wichtig, aber ich hätte gerne 3 anstelle von fn: max (2, 3). Wie es geht?

für diese XSL-Datei:

<?xml version="1.0"?> 

<xsl:stylesheet version="2.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:fn="http://www.w3.org/2005/02/xpath-functions" 
    xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance" > 

    <xsl:output method="xml" indent="yes" /> 
    <xsl:template match="/numbers"> 
     <numbers>  
      <xsl:value-of select="/numbers/number" />     

      fn:max(2, 3) 
      <xsl:value-of select="max(/numbers/number)"/> 

     </numbers> 
    </xsl:template> 

</xsl:stylesheet> 

der folgende Fehler auftritt:

SystemId Unbekannt; Linie # 13; Spalte # 49; Funktion konnte nicht gefunden werden: max SystemId Unbekannt; Linie # 13; Spalte # 49; Funktionsmarker nicht gefunden. (Ort des Fehlers unbekannt) java.lang.NullPointerException

(Ort des Fehlers unbekannt) XSLT-Fehler (javax.xml.transform.TransformerException) : keine xml-stylesheet PI gefunden: test.xml Exception in thread "main" java.lang.RuntimeException: Kein xml-stylesheet PI foun d in: test.xml unter org.apache.xalan.xslt.Process.doExit (Process.java:1155) bei org.apache.xalan. xslt.Process.main (Process.java:1128)

Ich verwendete Xalan - Version Xalan Java 2.7.1, Befehl: java org.apache.xalan.xslt.Process -in test.xml -xsl test.xsl - out output.xml

Antwort

2

Sie haben fn:max(2,3) in einen Textblock eingefügt. Nichts wird das interpretieren. Sie müssen Funktionen in value-of Ausdrücke setzen, wenn Sie möchten, dass sie ausgewertet werden.

+0

Sie so etwas wie das bedeutet Sie: es nicht funktioniert –

+0

Ich meine Welbog

4

Es gibt mehrere Probleme: max() muss in einem Wert-of sein, und dass Sie gesagt haben xsl:stylesheet version="2.0" für Xalan, die nur XSLT 1.0 unterstützt. Für 2.0 benötigen Sie Saxon 9.x.

Da max() 1.0 nicht Teil von XSLT ist, müssen Sie die EXSLT Erweiterung Unterstützung aufzurufen, die Xalan hat:

<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:math="http://exslt.org/math"> 
    <xsl:template match="/numbers"> 
     <xsl:value-of select="math:max(number)"/> 
    </xsl:template> 
</xsl:stylesheet> 

oder

<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:math="http://exslt.org/math"> 
    <xsl:template match="/"> 
     <xsl:value-of select="math:max(numbers/number)"/> 
    </xsl:template> 
</xsl:stylesheet> 
+0

Dies funktioniert auch für xsltproc – jrb

0

Lavino,

Danke für die Antwort. Ich weiß nicht, warum, aber ich war ziemlich sicher, dass Xalan 2.0 unterstützt ... Ich habe es getestet und es funktioniert für Saxon 9.

0

Sie

verwenden können
<xsl:value-of select="max(number)" /> 

die max aller zu erhalten Zahlen.

Soln:

<?xml version="1.0"?> 
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fn="http://www.w3.org/2005/02/xpath-functions" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <xsl:output method="xml" indent="yes"/> 

    <xsl:template match="/numbers"> 
     <numbers> 
      <max> 
       <xsl:value-of select="max(number)"/> 
      </max> 
      <xsl:apply-templates/> 
     </numbers> 
    </xsl:template> 

    <xsl:template match="number"> 
     <number> 
      <xsl:value-of select="."/> 
     </number> 
    </xsl:template> 

</xsl:stylesheet> 

Sie können die Anzahl Vorlage und <xsl:apply-templates/> wenn sie nicht reqd weglassen. Dies wird die Ausgabe mit dem oben Xslt sein:

<?xml version="1.0" encoding="UTF-8"?> 
<numbers xmlns:fn="http://www.w3.org/2005/02/xpath-functions" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <max>10</max> 
    <number>3</number> 
    <number>5</number> 
    <number>10</number> 
    <number>1</number> 
</numbers> 
Verwandte Themen