2016-04-01 6 views
1

Gibt es eine Möglichkeit, Dateinamen in XSLT (für Funktion?) Zu durchlaufen?Für x Funktion in XSLT?

Ich möchte überprüfen, ob die Datei von _001.jpg existiert ... bis ... _005.jpg

Zur Zeit kann ich eine Datei überprüfen:

<xsl:stylesheet exclude-result-prefixes="xs fs" version="2.0" xmlns:fs="java.io.File" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output cdata-section-elements="DESCRIPTION" indent="yes" method="xml"/> 
    <xsl:template match="@*|node()"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*|node()"/> 
    </xsl:copy> 
    </xsl:template> 
    <xsl:template match="product"> 
    <xsl:apply-templates/> 
    <xsl:variable name="imageproductid" select="code"/> 
    <xsl:choose> 
     <xsl:when test="fs:exists(fs:new(concat('/images/',$imageproductid,'_001.jpg')))"> 
     <IMAGE1> 
      <xsl:value-of select="concat('/images/',$imageproductid,'_001.jpg')"/> 
     </IMAGE1> 
     </xsl:when> 
    </xsl:choose> 
    </xsl:template> 
</xsl:stylesheet> 

wo <IMAGE1> Tag <IMAGE1>,<IMAGE2>,<IMAGE3>,<IMAGE4>,<IMAGE5> sein sollte

Ich benutze Saxon 9.1, XSLT 2.0.

Antwort

1

Verwenden Sie die alternative <xsl:for-each> Notation Schleife über einen Satz von ganzen Zahlen:

<xsl:for-each select="1 to 5"> 
    ... '.' will be an integer from 1 to 5 here 
</xsl:for-each> 

Um die Dateinamen von diesen zu erstellen, verwendet

... fs:exists(fs:new(concat('/images/',$imageproductid,'_00', ., '.jpg') 

und korrekt benannt neues Element zu erstellen, verwenden Sie <xsl:element> :

<xsl:element name="{concat('IMAGE', .)}"> 
    .. <IMAGEx> contents .. 
</xsl:element> 

Sie benötigen die Notation {..} hier, weil name ein gültiger QName sein muss (W3C, "11.2 Creating Element Nodes Using xsl:element"), den ich nehme als "der Literal Text muss ein gültiger möglicher Elementname sein".

Putting, dass zusammen, beenden Sie mit diesem prägnanten Code oben:

<xsl:template match="product"> 
    <xsl:apply-templates /> 

    <xsl:variable name="imageproductid" select="code" /> 

    <xsl:for-each select="1 to 5"> 
     <xsl:variable name="filename" 
      select="concat('/images/',$imageproductid,'_00', ., '.jpg')" /> 
     <xsl:if test="fs:exists(fs:new($filename))"> 
      <xsl:element name="{concat('IMAGE', .)}"> 
       <xsl:value-of select="$filename" /> 
      </xsl:element> 
     </xsl:if> 
    </xsl:for-each> 
</xsl:template> 
+1

Das ist perfekt: schnell und einfach. – Adrian