我试图在XSL中模拟StringBuilder行为。有没有办法做到这一点。鉴于XSLT是一种函数式编程语言
,这似乎很难答案 0 :(得分:4)
查看concat()
和string-join()
函数,也许这就是您所追求的目标。
答案 1 :(得分:2)
如果你正在查看一个节点集(只要你可以构造xpath来找到节点集),你就可以通过一点点的递归来简单地获得累积的concats,这样你就可以了在流程中添加任意位和碎片,它开始变得混乱。
为初学者尝试这个(也加入):
<xsl:template match="/">
<xsl:variable name="s">
<xsl:call-template name="stringbuilder">
<xsl:with-param name="data" select="*" /><!-- your path here -->
</xsl:call-template>
</xsl:variable>
<xsl:value-of select="$s" /><!-- now contains a big concat string -->
</xsl:template>
<xsl:template name="stringbuilder">
<xsl:param name="data"/>
<xsl:param name="join" select="''"/>
<xsl:for-each select="$data/*">
<xsl:choose>
<xsl:when test="not(position()=1)">
<xsl:value-of select="concat($join,child::text())"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="child::text()"/>
</xsl:otherwise>
</xsl:choose>
</xsl:for-each>
</xsl:template>
可能需要对此进行各种扩展:也许您想要修剪,也许您想要通过层次结构进行隧道传输。我不确定是否存在防弹通用解决方案。
答案 2 :(得分:1)
您可以使用所有可用的standard XPath 2.0 string functions ,例如concat()
,substring()
,substring-before()
,substring-after()
, string-join()
,...等等。
但是,如果您需要非常快速的字符串实现(甚至比.NET字符串类更快),您可能会对C# implementation的finger-tree data structure感兴趣和the extension functions I provided用于包装基于手指树的字符串的Saxon XSLT处理器。