首页 > 解决方案 > xsl 文本转换中的空格

问题描述

xsl:text包含单个(或多个)空格的 XSLT不会在 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"

这返回错误。结果是“foobar”。我实际上期待“foo bar”。我也尝试过,<xsl:text xml:space="preserve"> </xsl:text>但这也不起作用。

作为一种解决方法,我目前使用 <xsl:value-of select="' '"/>它可以正常工作,但我想知道这是否是一个错误?在 Saxon 中使用相同的转换和文档打印空格。

标签: xsltxquerymarklogic

解决方案


对于标准 XQuery,你应该得到你想要的

declare boundary-space preserve;

在查询序言中,请参阅https://www.w3.org/TR/xquery-31/#id-boundary-space-declshttps://www.w3.org/TR/xquery-31/#id-空白

示例是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/2foobar

我没有检查 Marklogic 是否支持该声明或某些专有的类似方式来更改元素构造函数中空格的解析处理。


推荐阅读