我想获取 XML 标记的内容,并在通过样式表查看时将其水平(镜像)和垂直(作为列)翻转显示。如果不使用随机的第三方库,这可能吗?
<mytag>Random Data</mytag>
最佳答案
因此,XSLT 不适合字符串处理。有了 XSLT 2.0,事情变得更好了,因为有更多的字符串函数可用,并且可以进行基于序列的操作。
在 XSLT 1.0(它仍然是为其编写代码的最便携版本)中,逐个字符的字符串处理只能通过递归来实现。为了好玩,这个:
<xsl:output method="text" />
<xsl:variable name="CRLF" select="' '" />
<xsl:template match="/mytag">
<!-- flip string -->
<xsl:call-template name="reverse-string">
<xsl:with-param name="s" select="string(.)" />
</xsl:call-template>
<xsl:value-of select="$CRLF" />
<!-- vertical string -->
<xsl:call-template name="vertical-string">
<xsl:with-param name="s" select="string(.)" />
</xsl:call-template>
</xsl:template>
<xsl:template name="reverse-string">
<xsl:param name="s" select="''" />
<xsl:variable name="l" select="string-length($s)" />
<xsl:value-of select="substring($s, $l, 1)" />
<xsl:if test="$l > 0">
<xsl:call-template name="reverse-string">
<xsl:with-param name="s" select="substring($s, 1, $l - 1)" />
</xsl:call-template>
</xsl:if>
</xsl:template>
<xsl:template name="vertical-string">
<xsl:param name="s" select="''" />
<xsl:variable name="l" select="string-length($s)" />
<xsl:value-of select="concat(substring($s, 1, 1), $CRLF)" />
<xsl:if test="$l > 0">
<xsl:call-template name="vertical-string">
<xsl:with-param name="s" select="substring($s, 2, $l)" />
</xsl:call-template>
</xsl:if>
</xsl:template>
产生:
ataD modnaR
R
a
n
d
o
m
D
a
t
a
编辑:明确一点:我不认可以任何方式实际使用上述代码示例。表现问题一定要在表现层解决。上面的方法可行,但逐字符递归是执行字符串处理的最低效方法之一,除非别无选择,否则请避免在 XSLT 中进行字符串处理。
关于xml - 是否可以使用 XSLT 翻转和旋转文本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/748423/