43 votes

XSLT a-t-il une fonction Split ()?

J'ai une chaîne dans un nœud et je voudrais diviser la chaîne sur '?' et retourne le dernier élément du tableau.

Par exemple, dans le bloc ci-dessous:

 <a>
    <xsl:attribute name="href">
        /newpage.aspx?<xsl:value-of select="someNode"/>
    </xsl:attribute>
    Link text
</a>
 

Je voudrais fractionner la valeur someNode .

Edit: Voici le VB.Net que je utilise pour charger le XSL pour ma page Asp.Net:

 Dim xslDocPath As String = HttpContext.Current.Server.MapPath("~/App_Data/someXslt.xsl")
Dim myXsltSettings As New XsltSettings()
Dim myXMLResolver As New XmlUrlResolver()

myXsltSettings.EnableScript = True
myXsltSettings.EnableDocumentFunction = True

myXslDoc = New XslCompiledTransform(False)
myXslDoc.Load(xslDocPath, myXsltSettings, myXMLResolver)

Dim myStringBuilder As New StringBuilder()
Dim myXmlWriter As XmlWriter = Nothing

Dim myXmlWriterSettings As New XmlWriterSettings()
myXmlWriterSettings.ConformanceLevel = ConformanceLevel.Auto
myXmlWriterSettings.Indent = True
myXmlWriterSettings.OmitXmlDeclaration = True

myXmlWriter = XmlWriter.Create(myStringBuilder, myXmlWriterSettings)

myXslDoc.Transform(xmlDoc, argumentList, myXmlWriter)

Return myStringBuilder.ToString()
 

Mise à jour: voici un exemple de fractionnement XML sur un nœud particulier

52voto

mortenbpost Points 1204

Utilisez une méthode récursive:

 <xsl:template name="output-tokens">
    <xsl:param name="list" /> 
    <xsl:variable name="newlist" select="concat(normalize-space($list), ' ')" /> 
    <xsl:variable name="first" select="substring-before($newlist, ' ')" /> 
    <xsl:variable name="remaining" select="substring-after($newlist, ' ')" /> 
    <id>
    	<xsl:value-of select="$first" /> 
    </id>
    <xsl:if test="$remaining">
    	<xsl:call-template name="output-tokens">
    		<xsl:with-param name="list" select="$remaining" /> 
    	</xsl:call-template>
    </xsl:if>
</xsl:template>
 

11voto

Jacob Points 9117

Oui, utilisez tokenize(string, separator) :

 tokenize("XPath is fun", "\s+")
Result: ("XPath", "is", "fun")
 

Voir la référence de la fonction w3schools xpath

[EDIT: Je pense avoir mal compris la question. Je pensais que vous vouliez diviser les paramètres GET après le ? dans un tableau. Pour diviser une chaîne en UN SEUL caractère, substring-after est votre meilleur choix.]

8voto

travis Points 14676

J'ai fini par utiliser la fonction substring-after() . Voici ce qui a fonctionné pour moi:

 <a>
    <xsl:attribute name="href">
    	/newpage.aspx?<xsl:value-of select="substring-after(someNode, '?')"/>
    </xsl:attribute>
    Link text
</a>
 

Même après avoir défini la version de mon XSLT sur 2.0, j'ai toujours une erreur " 'tokenize()' is an unknown XSLT function. " lorsque j'essayais d'utiliser tokenize() .

6voto

Paul Wagland Points 10487

En ajoutant une autre possibilité, si votre moteur de modèle prend en charge EXSLT , vous pouvez utiliser tokenize () à partir de cela.

Par exemple:

 <xsl:stylesheet version="1.0"
                xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns:str="http://exslt.org/strings"
                extension-element-prefixes="str">

...
  <a>
    <xsl:attribute name="href">
      <xsl:text>/newpage.aspx?</xsl:text>
      <xsl:value-of select="str:tokenize(someNode)[2]"/>
    </xsl:attribute>              
  </a>
...
</xsl:stylesheet>
 

3voto

James Sulak Points 9959

.NET ne supporte malheureusement pas XSLT 2.0. Je suis à peu près sûr qu'il prend en charge EXSLT, qui a une fonction split () . Microsoft a une page plus ancienne sur son implémentation de EXSLT.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X