Пробелы в преобразовании текста xsl - PullRequest
2 голосов
/ 23 апреля 2019

XSLT с xsl:text, содержащим один (или несколько) пробелов, не печатает пробелы в MarkLogic 9.0-9.Смотрите следующий пример:

xquery version "1.0-ml";

let $doc := 
  <doc>
    <foo>foo</foo>
    <bar>bar</bar>
  </doc>
let $xsl :=
  <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                  version="2.0">
      <xsl:output method="text" omit-xml-declaration="yes" indent="no" />

      <xsl:template match="doc">
          <xsl:value-of select="foo"/>
          <xsl:text> </xsl:text>
          <xsl:value-of select="bar"/>
      </xsl:template>
  </xsl:stylesheet>

return xdmp:xslt-eval($xsl, $doc) = "foo bar"

Возвращает false.Результат - "foobar".Я действительно ожидал "Foo Bar".Я также пробовал с <xsl:text xml:space="preserve"> </xsl:text>, но это тоже не работает.

В качестве обходного пути я в настоящее время использую <xsl:value-of select="' '"/>, который работает нормально, но мне интересно, если это ошибка?При использовании того же преобразования и документа в Saxon печатается пробел.

1 Ответ

4 голосов
/ 23 апреля 2019

Для стандартного XQuery вы должны получить то, что вы хотите, с

declare boundary-space preserve;

в прологе запроса, см. https://www.w3.org/TR/xquery-31/#id-boundary-space-decls и https://www.w3.org/TR/xquery-31/#id-whitespace.

Пример: https://xqueryfiddle.liberty -development.net / eiQZDbq / 4 делает

declare boundary-space preserve;

declare namespace output = "http://www.w3.org/2010/xslt-xquery-serialization";
declare option output:method 'text';


let $doc := 
  <doc>
    <foo>foo</foo>
    <bar>bar</bar>
  </doc>
let $xsl :=
  <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                  version="2.0">
      <xsl:output method="text" omit-xml-declaration="yes" indent="no" />

      <xsl:template match="doc">
          <xsl:value-of select="foo"/>
          <xsl:text> </xsl:text>
          <xsl:value-of select="bar"/>
      </xsl:template>
  </xsl:stylesheet>

return transform(map { 'source-node' : $doc, 'stylesheet-node' : $xsl })?output 

, возвращая foo bar, в то время как https://xqueryfiddle.liberty -development.net / eiQZDbq / 2 без этогодекларация возвращает foobar.

Я не проверял, поддерживает ли Marklogic эту декларацию или какой-то собственный аналогичный способ изменить обработку разбора пробелов в конструкторах элементов.

...