我有一个字符串中的一个节点,我想拆就字符串“?” 和数组中返回的最后一个项目。
例如,在下面的块:
<a>
<xsl:attribute name="href">
/newpage.aspx?<xsl:value-of select="someNode"/>
</xsl:attribute>
Link text
</a>
我想分裂someNode
值。
编辑:这是我用来加载XSL我的Asp.Net页面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的例子
Answer 1:
使用递归方法:
<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>
Answer 2:
如果您可以使用XSLT 2.0或更高版本,可以使用tokenize(string, separator)
:
tokenize("XPath is fun", "\s+")
Result: ("XPath", "is", "fun")
请参阅W3Schools的XPath函数引用 。
默认情况下,.NET不支持XSLT 2.0,更不用说XSLT 3.0。 唯一已知2.0+处理器用于.NET是撒克逊用于.NET与IKVM , Exselt ,一个.NET XSLT 3.0在测试目前的处理器,和XMLPrime XSLT 2.0处理器。
Answer 3:
我结束了使用的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()
Answer 4:
添加另一种可能性,如果你的模板引擎支持EXSLT ,那么你可以使用令牌化()从。
例如:
<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>
Answer 5:
.NET不支持XSLT 2.0,很遗憾。 我敢肯定,它支持EXSLT,其中有一个拆分()函数。 微软有一个旧的页面对其实施EXSLT的。
Answer 6:
您可以编写使用模板string-before
和string-after
函数并使用它的对面。 我写了一个博客上的这一点。
最后想出了将分隔字符串分割为多个子一个XSLT模板。 我不声称这是最聪明的脚本,但肯定解决我的问题。
样式表:
<?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>
Answer 7:
XSLT 1.0没有分裂的功能本身,而是你可能做到你想用串 - 前子,后发挥作用做什么。
或者,如果您使用的是微软的XSLT引擎,你可以使用内联C#。
Answer 8:
只是为了记录在案,如果你有1.0这样做,并且你确实需要分流/ tokenise,你需要的XSLT扩展 。
文章来源: Does XSLT have a Split() function?