Можно ли переворачивать и поворачивать текст с помощью XSLT? - PullRequest
4 голосов
/ 14 апреля 2009

Я хотел бы взять содержимое тега XML и отобразить его как горизонтально (зеркальное изображение), так и вертикально (в виде столбца) при просмотре через таблицу стилей. Возможно ли это без использования случайных сторонних библиотек?

<mytag>Random Data</mytag>

Ответы [ 4 ]

4 голосов
/ 14 апреля 2009

Таким образом, 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-to-char является одним из самых неэффективных способов обработки строк, и, если у вас нет другого выбора, избегайте обработки строк в XSLT.

3 голосов
/ 14 апреля 2009

XSLT для преобразования. Чтобы изменить презентацию, вы должны использовать CSS или XSL-FO.

В XSL-FO вы можете установить writing-mode на tb-lr

2 голосов
/ 14 апреля 2009

Вартек прав. В итоге я выполнил это с помощью следующего CSS:

.verticaltext {
  writing-mode: tb-rl;
  filter: flipv;
}

Спасибо!

1 голос
/ 15 апреля 2009

Это очень легко сделать с 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:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...