是否可以使用XSLT翻转和旋转文本?

时间:2009-04-14 16:40:37

标签: xml xslt

我希望获取XML标记的内容,并在通过样式表查看时将其显示为水平(镜像)和垂直(作为列)。如果不使用随机第三方库,这可能吗?

<mytag>Random Data</mytag>

4 个答案:

答案 0 :(得分:4)

因此,XSLT不适合字符串处理。使用XSLT 2.0,事情变得更好,因为有更多的字符串函数可用,并且基于序列的操作是可能的。

在XSLT 1.0(仍然是编写代码的最便携版本)中,逐个字符的字符串处理只能通过递归来实现。为了好玩,这个:

<xsl:output method="text" />

<xsl:variable name="CRLF" select="'&#13;&#10;'" />

<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 &gt; 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 &gt; 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&#xA;')

我们想要操作的字符串包含在变量$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&#xA;')"/>

  <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函数: