XSLT ha una funzione Split ()?

Ho una stringa in un nodo e mi piacerebbe dividere la stringa su “?” e restituire l’ultimo elemento nell’array.

Ad esempio, nel blocco sottostante:

  /newpage.aspx?  Link text  

Mi piacerebbe dividere il valore someNode .

Modifica: Ecco il VB.Net che utilizzo per caricare Xsl per la mia pagina 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() 

Aggiornamento: ecco un esempio di suddivisione XML su un particolare nodo

Usa un metodo ricorsivo:

               

Se è ansible utilizzare XSLT 2.0 o versioni successive, è ansible utilizzare tokenize(string, separator) :

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

Vedi il riferimento alla funzione XPath di w3schools .

Per impostazione predefinita, .NET non supporta XSLT 2.0, tanto meno XSLT 3.0. Gli unici processori 2.0 per .NET conosciuti sono Saxon per .NET con IKVM , Exselt , un processore .NET XSLT 3.0 attualmente in versione beta e il processore XMLPrime XSLT 2.0.

Ho finito per usare la funzione substring-after() . Ecco cosa ha funzionato per me:

   /newpage.aspx?  Link text  

Anche dopo aver impostato la versione del mio XSLT su 2.0, ho ancora un ” 'tokenize()' is an unknown XSLT function. ” Errore quando si tenta di usare tokenize() .

Aggiungendo un’altra possibilità, se il tuo motore modello supporta EXSLT , allora potresti usare tokenize () da quello.

Per esempio:

  ...   /newpage.aspx?    ...  

.NET non supporta XSLT 2.0, sfortunatamente. Sono abbastanza sicuro che supporti EXSLT, che ha una funzione split () . Microsoft ha una pagina precedente sulla sua implementazione di EXSLT.

Puoi scrivere un modello usando le funzioni string-before e string-after e usarlo su across. Ho scritto un blog su questo.

Alla fine è arrivato un modello xslt che avrebbe diviso una stringa delimitata in sottostringhe. Non sostengo che sia la sceneggiatura più intelligente, ma sicuramente risolve il mio problema.

Foglio di stile:

         

File XML (da trasformare):

     C:\ProgramFiles\SomeWierdSoftware \   

XSLT 1.0 non ha una funzione split di per sé, ma potresti potenzialmente ottenere ciò che stai cercando di fare con le funzioni sottostringa-prima e sottostringa-dopo.

In alternativa, se stai usando un motore Microsoft XSLT, potresti usare inline C #.

Per la cronaca, se stai facendo questo con 1.0, e hai davvero bisogno di una divisione / token, hai bisogno delle estensioni xslt .