我希望获取XML标记的内容,并在通过样式表查看时将其显示为水平(镜像)和垂直(作为列)。如果不使用随机第三方库,这可能吗?
<mytag>Random Data</mytag>
答案 0 :(得分:4)
因此,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
编辑:要明确:我不以任何方式认可上述代码示例的实际使用。应该在表示层中解决表述问题。上面的方法是可行的,但char-by-char递归是进行字符串处理的最低效方法之一,除非你别无选择,否则请避免在XSLT中进行字符串处理。
答案 1 :(得分:3)
XSLT用于转换。要更改演示文稿,您应该使用CSS或XSL-FO。
在XSL-FO中,您可以设置writing-mode
to tb-lr
答案 2 :(得分:2)
Vartec是对的。我最终使用以下CSS完成它:
.verticaltext {
writing-mode: tb-rl;
filter: flipv;
}
谢谢!
答案 3 :(得分:1)
使用XPath 2.0 / XSLT 2.0 非常容易(在XSLT 1.0中可以使用FXSL 1的函数/模板。 X):
这两个任务都可以作为XPath 2.0表达式的结果生成:
<强> 1。反转字符串:
codepoints-to-string(
reverse(string-to-codepoints($vText))
)
<强> 2。垂直化字符串:
replace($vText, '(.)', '$1
')
我们想要操作的字符串包含在变量$vText
。
要看到这一点,我们只需将上述XPath表达式放入XSLT 2.0样式表:
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xsl:output method="text"/>
<xsl:variable name="vText" as="xs:string"
select="'Random Data'"/>
<xsl:variable name="vReversed" as="xs:string"
select="codepoints-to-string(
reverse(string-to-codepoints($vText))
)
"
/>
<xsl:variable name="vVertical" as="xs:string*"
select="replace($vText, '(.)', '$1
')"/>
<xsl:template match="/">
<xsl:sequence select="$vReversed"/>
===================================
<xsl:text/>
<xsl:sequence select="$vVertical"/>
</xsl:template>
</xsl:stylesheet>
执行此转换时(无论是什么(如果有)XML文档),生成所需结果 ::)
ataD modnaR
===================================
R
a
n
d
o
m
D
a
t
a
请注意使用以下标准XPath 2.0函数: