在 xslt 中的字符串中创建计数器
Creating counter inside a string in xslt
如何在元素内使用换行符或字符串创建增量计数器?我们在 xml
上有这个值
<root>
<text>One
Two
Three
Four
Five
</text>
</root>
预期模板:
<xsl:template match="root">
<xsl:param name="delimiter" select="' '"/>
<xsl:variable name="token" select="substring-before(concat(text, $delimiter))" />
<xsl:if test="$token">
<xsl:value-of select="my-count-here"/> <xsl:value-of select="$token"/>
</xsl:if>
</xsl:template>
预期结果:
1 One
2 Two
3 Three
4 Four
5 Five
节点“my-count-here”是计数器并将其用作 id。任何人都可以知道如何实现这一点吗?
您显示的结果可以通过应用以下样式表生成:
XSLT 1.0
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" encoding="utf-8"/>
<xsl:template match="/root">
<xsl:call-template name="tokenize">
<xsl:with-param name="text" select="text"/>
</xsl:call-template>
</xsl:template>
<xsl:template name="tokenize">
<xsl:param name="text"/>
<xsl:param name="delimiter" select="' '"/>
<xsl:param name="i" select="1"/>
<xsl:variable name="token" select="substring-before(concat($text, $delimiter), $delimiter)" />
<xsl:if test="$token">
<xsl:value-of select="$i"/>
<xsl:text> </xsl:text>
<xsl:value-of select="$token"/>
</xsl:if>
<xsl:if test="contains($text, $delimiter)">
<xsl:text> </xsl:text>
<!-- recursive call -->
<xsl:call-template name="tokenize">
<xsl:with-param name="text" select="substring-after($text, $delimiter)"/>
<xsl:with-param name="i" select="$i + 1"/>
</xsl:call-template>
</xsl:if>
</xsl:template>
</xsl:stylesheet>
注意 (1) 使用 named 模板和 (2) 递归调用。您的尝试中缺少两者。
如何在元素内使用换行符或字符串创建增量计数器?我们在 xml
上有这个值<root>
<text>One
Two
Three
Four
Five
</text>
</root>
预期模板:
<xsl:template match="root">
<xsl:param name="delimiter" select="' '"/>
<xsl:variable name="token" select="substring-before(concat(text, $delimiter))" />
<xsl:if test="$token">
<xsl:value-of select="my-count-here"/> <xsl:value-of select="$token"/>
</xsl:if>
</xsl:template>
预期结果:
1 One
2 Two
3 Three
4 Four
5 Five
节点“my-count-here”是计数器并将其用作 id。任何人都可以知道如何实现这一点吗?
您显示的结果可以通过应用以下样式表生成:
XSLT 1.0
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" encoding="utf-8"/>
<xsl:template match="/root">
<xsl:call-template name="tokenize">
<xsl:with-param name="text" select="text"/>
</xsl:call-template>
</xsl:template>
<xsl:template name="tokenize">
<xsl:param name="text"/>
<xsl:param name="delimiter" select="' '"/>
<xsl:param name="i" select="1"/>
<xsl:variable name="token" select="substring-before(concat($text, $delimiter), $delimiter)" />
<xsl:if test="$token">
<xsl:value-of select="$i"/>
<xsl:text> </xsl:text>
<xsl:value-of select="$token"/>
</xsl:if>
<xsl:if test="contains($text, $delimiter)">
<xsl:text> </xsl:text>
<!-- recursive call -->
<xsl:call-template name="tokenize">
<xsl:with-param name="text" select="substring-after($text, $delimiter)"/>
<xsl:with-param name="i" select="$i + 1"/>
</xsl:call-template>
</xsl:if>
</xsl:template>
</xsl:stylesheet>
注意 (1) 使用 named 模板和 (2) 递归调用。您的尝试中缺少两者。