¿XSLT tiene una función Split ()?

Tengo una cadena en un nodo y me gustaría dividir la cadena en ‘?’ y devolver el último elemento de la matriz.

Por ejemplo, en el siguiente bloque:

  /newpage.aspx?  Link text  

Me gustaría dividir el valor de someNode .

Editar: Aquí está el VB.Net que utilizo para cargar el Xsl para mi página de 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() 

Actualización: aquí hay un ejemplo de división de XML en un nodo particular

Use un método recursivo:

               

Si puede usar XSLT 2.0 o superior, puede usar tokenize(string, separator) :

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

Consulte la referencia de la función XPath de w3schools .

De forma predeterminada, .NET no es compatible con XSLT 2.0, y mucho menos con XSLT 3.0. Los únicos procesadores 2.0+ conocidos para .NET son Saxon para .NET con IKVM , Exselt , un procesador .NET XSLT 3.0 actualmente en beta y el procesador XMLPrime XSLT 2.0.

Terminé usando la función substring-after() . Esto es lo que funcionó para mí:

   /newpage.aspx?  Link text  

Incluso después de configurar la versión de mi XSLT en 2.0, todavía 'tokenize()' is an unknown XSLT function. error ” 'tokenize()' is an unknown XSLT function. ” Al intentar usar tokenize() .

Si agrega otra posibilidad, si su motor de plantilla admite EXSLT , entonces podría usar tokenize () a partir de eso.

Por ejemplo:

  ...   /newpage.aspx?    ...  

.NET no es compatible con XSLT 2.0, desafortunadamente. Estoy bastante seguro de que es compatible con EXSLT, que tiene una función de división () . Microsoft tiene una página anterior sobre su implementación de EXSLT.

Puede escribir una plantilla utilizando string-before funciones string-before y string-after y usarla en el otro lado. Escribí un blog sobre esto.

Finalmente apareció una plantilla xslt que dividiría una cadena delimitada en subcadenas. No pretendo que sea el guión más inteligente, pero seguramente resuelve mi problema.

Hoja de estilo:

 < ?xml version="1.0" encoding="iso-8859-1"?>        

Archivo XML (para ser transformado):

 < ?xml version="1.0" encoding="utf-8"?> < ?xml-stylesheet type="text/xsl" href="textSpliter.xslt"?>   C:\ProgramFiles\SomeWierdSoftware \   

XSLT 1.0 no tiene una función dividida per se, pero es posible que logre lo que intenta hacer con las funciones substring-before y substring-after.

Alternativamente, si está utilizando un motor XSLT de Microsoft, puede usar C # en línea.

Solo para el registro, si estás haciendo esto con 1.0, y realmente necesitas un split / tokenise, necesitas las extensiones xslt .