2016-05-31 2 views
1

Ich versuche auf ein bestimmtes Element in einem Array zuzugreifen, abhängig vom Wert des aktuellen Datums in einer XML-Datei.Array bei einem Variablenindex in XSLT

Zum Beispiel in der XML-

<CurrentMonth>5</CurrentMonth> 

Dann wird in der XSLT - dies wird als Variable gesetzt als

<xsl:variable name="current-month"> 
     xsl:value-of select="//CurrentMonth" /> 
    </xsl:variable> 

Ich habe auch eine Reihe der „Monatsnamen“ deklariert als

<xsl:variable name="array" as="element()*"> 
    <Item>Jan</Item> 
    <Item>Feb</Item> 
    <Item>Mar</Item> 
    <Item>Apr</Item> 
    <Item>May</Item> 
    <Item>Jun</Item> 
    <Item>Jul</Item> 
    <Item>Aug</Item> 
    <Item>Sept</Item> 
    <Item>Oct</Item> 
    <Item>Nov</Item> 
    <Item>Dec</Item> 
</xsl:variable> 

Ist es möglich, in XSLT den Namen des Monats (zB „Jan“) unter Verwendung einer Variable als Index zurückzukehren für das Array?

Beispiel:

<xsl:value-of select="$array[$current-month]"> 

Der obige Code wirft mich

[FATAL]: Error checking type of the expression 'filter-expr(variable-ref(array/result-tree) 

Vielen Dank im Voraus.

+0

Bitte wählen Sie entweder XSLT 1.0 oder 2.0, nicht beide. –

+0

Entschuldigung, dies ist XSLT 2.0 – Cdok

Antwort

2

Sie haben mehrere Syntaxfehler:

<xsl:variable name="current-month"> 
    xsl:value-of select="//CurrentMonth" /> 
</xsl:variable> 

Bedürfnisse sein:

<xsl:variable name="current-month"> 
    <xsl:value-of select="//CurrentMonth" /> 
</xsl:variable> 

oder vorzugsweise:

<xsl:variable name="current-month" select="//CurrentMonth" /> 

Weiter Sie haben:

<xsl:value-of select="$array[$current-month]"> 

, die geschlossen werden muss:

<xsl:value-of select="$array[$current-month]"/> 

und verwenden, wenn Sie die erste Form die Variable zu definieren, muss es sein:

<xsl:value-of select="$array[number($current-month)]"> 
+1

Syntaxfehler waren gerade im Stapelüberlauf, als ich das Szenario eintippte und einige Fehler, Entschuldigungen hatte. $ array [Zahl ($ aktueller-Monat)] löste es für ich. Danke! – Cdok

1

Definieren Sie die Variable als <xsl:variable name="current-month" select="xs:integer(//CurrentMonth)"/>, dann können Sie $array[$current-month] verwenden (obwohl Sie eine Sequenz und kein Array indizieren). Mit Ihrem Code benötigen Sie $array[position() = $current-month].

Ein minimaler aber kompletter Sheet, das für mich in Ordnung läuft mit Saxon HE

9.6.0.7 ist
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    exclude-result-prefixes="xs" 
    version="2.0"> 

    <xsl:variable name="array" as="element()*"> 
     <Item>Jan</Item> 
     <Item>Feb</Item> 
     <Item>Mar</Item> 
     <Item>Apr</Item> 
     <Item>May</Item> 
     <Item>Jun</Item> 
     <Item>Jul</Item> 
     <Item>Aug</Item> 
     <Item>Sept</Item> 
     <Item>Oct</Item> 
     <Item>Nov</Item> 
     <Item>Dec</Item> 
    </xsl:variable> 

    <xsl:variable name="current-month" select="xs:integer(//CurrentMonth)"/> 

    <xsl:template match="/"> 
     <xsl:value-of select="$array[$current-month]"/> 
    </xsl:template> 

</xsl:stylesheet> 

und Ausgänge May, wenn sie gegen den Eingang <CurrentMonth>5</CurrentMonth> laufen.

+0

Ich versuchte Ihren ersten Vorschlag und erhielt [FEHLER]: Namespace-Präfix 'xs' ist nicht deklariert. – Cdok

+1

Ja, nun, Sie müssen auch 'xmlns: xs =" http://www.w3.org/2001/XMLSchema "' im Stammverzeichnis Ihres Stylesheets deklarieren, um die Schemadatentypen wie 'xs: integer' zu verwenden. –

+0

Es wirft mich jetzt "[ERROR]: Das erste Argument der nicht statischen Java-Funktion 'Integer' ist kein gültiger Objektverweis. [ERROR]: Stylesheet konnte nicht kompiliert werden [FATAL]: Fehler beim Überprüfen des Typs des Ausdrucks 'filter-expr (variable-ref (array/result-tree), [pred (variable-ref (aktueller-monat/void)) ]) '. " – Cdok

Verwandte Themen