【问题标题】:Whitespace in xsl text transformationxsl 文本转换中的空格
【发布时间】:2019-09-12 19:48:51
【问题描述】:

带有包含单个(或多个)空格的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”。 我也试过&lt;xsl:text xml:space="preserve"&gt; &lt;/xsl:text&gt;,但这也不起作用。

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

【问题讨论】:

  • 我看到相同的“失败”,仅使用 Saxon XQuery 在 xqueryfiddle.liberty-development.net/eiQZDbq/2 调用 XPath 3.1 的 transform 函数,所以我认为问题在于 XQuery 中内联包含 XSLT 代码以及 XQuery 如何处理此类元素构造函数中的空白。我需要深入研究 XQuery 规范以找出解释它的原因以及是否可以选择使用不同的解析模式。在 XSLT 2 方面,只需执行 &lt;xsl:value-of select="foo, bar"/&gt; 即可修复独立于任何 XQuery 元素构造的简单测试用例。

标签: xslt xquery marklogic


【解决方案1】:

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

declare boundary-space preserve;

在查询序言中,请参阅 https://www.w3.org/TR/xquery-31/#id-boundary-space-declshttps://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 barhttps://xqueryfiddle.liberty-development.net/eiQZDbq/2 没有该声明返回foobar

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

【讨论】:

  • 很好的答案。使用 MarkLogic 对其进行了测试,并且可以正常工作。谢谢。
  • 要明确为什么这有效:xsl:text 在 XSLT 中是特殊的,因为它保留了空格,但在 XQuery 中并不特殊。空格作为 XQuery 执行的树构造语义的一部分被剥离,并且在 XSLT 开始起作用时它已经消失了。 XQuery 规范建议将&lt;xsl:text&gt;{" "}&lt;/xsl:text&gt; 作为一种强制元素具有空白内容的方式,而与边界空间策略无关。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多