2012-04-12 4 views

Antwort

0

In XSLT 2.0 erhalten kann unter Verwendung tokenize(), number() und sum() Funktionen, zum Beispiel die unten getan werden. Beachten Sie, dass ich mögliche Leerzeichen um die Zeichen + eingefügt habe.

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 

    <xsl:variable name="test1">1+1+0</xsl:variable> 
    <xsl:variable name="test2"> 3 + 
    5 +   12 </xsl:variable> 

    <xsl:template match="/"> 
     <xsl:variable name="testSplit1" select="tokenize($test1,'\s*\+\s*')"/> 
     <xsl:variable name="testSplitNum1"> 
      <xsl:for-each select="$testSplit1"> 
       <item><xsl:value-of select="number(.)"/></item> 
      </xsl:for-each> 
     </xsl:variable> 

     <xsl:variable name="testSplit2" select="tokenize($test2,'\s*\+\s*')"/> 
     <xsl:variable name="testSplitNum2"> 
      <xsl:for-each select="$testSplit2"> 
       <item><xsl:value-of select="number(.)"/></item> 
      </xsl:for-each> 
     </xsl:variable> 

     <root> 
      <items1><xsl:copy-of select="$testSplitNum1"/></items1> 
      <sum1><xsl:value-of select="sum($testSplitNum1/item)"/></sum1> 
      <items2><xsl:copy-of select="$testSplitNum2"/></items2> 
      <sum2><xsl:value-of select="sum($testSplitNum2/item)"/></sum2> 
     </root> 

    </xsl:template> 

</xsl:stylesheet> 

Das Ergebnis (mit Dummy-Eingangsdatei) ist

<?xml version="1.0" encoding="UTF-8"?> 
<root> 
    <items1> 
     <item>1</item> 
     <item>1</item> 
     <item>0</item> 
    </items1> 
    <sum1>2</sum1> 
    <items2> 
     <item>3</item> 
     <item>5</item> 
     <item>12</item> 
    </items2> 
    <sum2>20</sum2> 
</root> 
+0

Funktioniert perfekt :) Danke – Gust

+0

Aber funktioniert nur für eine sehr begrenzte Klasse von Ausdrücken! –

1

Es gibt keinen allgemeinen Mechanismus in XSLT 1.0 oder XSLT 2.0 einen XPath-Ausdruck als String-Wert zugeführt zu bewerten. Viele Produkte haben dafür eine Erweiterung (siehe zum Beispiel saxon: evaluate()). Ein allgemeiner Mechanismus wird in XSLT 3.0 eingeführt: die Anweisung xsl: evaluate.

Verwandte Themen