XSLT是否具有Split()函数?
时间:2020-03-06 14:45:13 来源:igfitidea点击:
我在节点中有一个字符串,我想在'?'上分割字符串并返回数组中的最后一项。
例如,在下面的块中:
<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的示例
解决方案
如果我们可以使用XSLT 2.0或者更高版本,则可以使用tokenize(string,eparator)
:
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,当前处于beta版的.NET XSLT 3.0处理器以及XMLPrime XSLT 2.0处理器。
XSLT 1.0本身没有拆分功能,但是我们可能可以使用substring-before和substring-after函数来实现我们想要的功能。
另外,如果我们使用的是Microsoft XSLT引擎,则可以使用内联C#。
我最终使用了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()'时,仍然出现"
'tokenize()'是未知的XSLT函数。'"错误。
仅作记录,如果我们使用1.0进行此操作,并且确实需要拆分/标记,则需要xslt扩展名。
使用递归方法:
<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>
不幸的是,.NET不支持XSLT 2.0。我很确定它支持EXSLT,它具有split()函数。 Microsoft对其EXSLT的实现有较旧的介绍。
另外,如果模板引擎支持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>