XSLT是否具有Split()函数?

我在节点中有一个string,我想分割'?'string 并返回数组中的最后一项。

例如,在下面的块中:

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

我想分割someNode值。

编辑:这是我用来加载我的Asp.Net页面的Xsl VB.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() 

更新:这是一个在特定节点上分割XML的示例

使用recursion方法:

 <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> 

如果您可以使用XSLT 2.0或更高版本,则可以使用tokenize(string, separator)

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

请参阅w3schools XPath函数参考 。

默认情况下,.NET不支持XSLT 2.0,更不用说XSLT 3.0了。 用于.NET的唯一已知的2.0+处理器是具有IKVM的 Saxon for .NET , Exselt ,目前处于testing阶段的.NET XSLT 3.0处理器和XMLPrime XSLT 2.0处理器。

我结束了使用substring-after()函数。 以下是对我有用的东西:

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

即使在将我的XSLT版本设置为2.0之后,我仍然得到一个“ 'tokenize()' is an unknown XSLT function. ”尝试使用tokenize()时出错。

如果你的模板引擎支持EXSLT ,那么你可以使用tokenize() 。

例如:

 <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> 

不幸的是,.NET不支持XSLT 2.0。 我很确定它支持EXSLT,它有一个split()函数。 微软在其EXSLT的实施上有一个较老的页面 。

您可以使用string-beforestring-after函数编写模板string-beforestring-after其中使用它。 我在这里写了一个博客 。

最后想出了一个xslt模板,将分隔string拆分为子string。 我不认为这是最聪明的脚本,但肯定解决了我的问题。

样式表:

 <?xml version="1.0" encoding="iso-8859-1"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="/"> <xsl:for-each select="Paths/Item"> <xsl:call-template name="SplitText"> <xsl:with-param name="inputString" select="Path"/> <xsl:with-param name="delimiter" select="Delimiter"/> </xsl:call-template> <br/> </xsl:for-each> </xsl:template> <xsl:template name="SplitText"> <xsl:param name="inputString"/> <xsl:param name="delimiter"/> <xsl:choose> <xsl:when test="contains($inputString, $delimiter)"> <xsl:value-of select="substring-before($inputString,$delimiter)"/> <xsl:text disable-output-escaping = "no"> </xsl:text> <xsl:call-template name="SplitText"> <xsl:with-param name="inputString" select="substring-after($inputString,$delimiter)"/> <xsl:with-param name="delimiter" select="$delimiter"/> </xsl:call-template> </xsl:when> <xsl:otherwise> <xsl:choose> <xsl:when test="$inputString = ''"> <xsl:text></xsl:text> </xsl:when> <xsl:otherwise> <xsl:value-of select="$inputString"/> <xsl:text> </xsl:text> </xsl:otherwise> </xsl:choose> </xsl:otherwise> </xsl:choose> </xsl:template> </xsl:stylesheet> 

XML文件(待转换):

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

XSLT 1.0本身没有分割函数,但是你可能可以实现你想要用substring-before和substring-after函数做的事情。

或者,如果您使用Microsoft XSLT引擎,则可以使用内联C#。

只是为了logging,如果你用1.0来做这个,而且你真的需要split / tokenise,你需要xslt扩展 。