【问题标题】:xquery should give me proper closed tags for empty node (sql server 2008)xquery 应该给我正确的空节点封闭标签(sql server 2008)
【发布时间】:2012-04-05 11:29:23
【问题描述】:

如果我有以下一些空节点的 xml,如下所示。

<TAG ID="abc"></TAG>

当我修改/选择这个 xml 时,它会返回空标签,例如

<TAG ID="abc" />

我想用</TAG> 关闭类似的空标签

我能做到吗...?

【问题讨论】:

  • 不合适,但我希望标签应该用</TAG>关闭。

标签: xml sql-server-2008 xquery xquery-sql


【解决方案1】:

请注意,SQL Server 中 XML 结果的序列化不是由 XQuery 本身决定的,而是由 XML 数据类型到字符串表示形式的转换决定的。在你的例子中

DECLARE @X XML; SET @X = '<TAG ID="abc"></TAG>'; SELECT @X;

您没有使用 XQuery,您只是在使用 XML Parser 和 XML 序列化程序。

因此,即使我们添加了 XQuery vNext 的序列化选项,它们也不会产生影响。

正如 Michael Kay 所提到的,这两个序列化之间没有区别。为什么要区分两者?如果您有一个需要区分的工具,我建议让他们更改它以使其解析器符合标准。或者,看看您是否可以在客户端找到一个 XML 解析器/序列化器,它为您提供有关如何序列化空内容元素的选项。

如果您需要完全的词法保真度而不是数据库中的 XML Infoset 保真度,我建议将您的 XML 存储在 varbinary(max) 中,因为这将保留您的编码和您输入的每个代码点,但代价是拥有将运行时强制转换为 XML 以进行任何查询处理。

最好的问候 迈克尔

【讨论】:

    【解决方案2】:

    任何使用 XML 的应用程序都应该将 和 视为等价的,因此 XQuery 处理器假定它们是等价的,并且没有正当理由让用户更喜欢一种形式而不是另一种形式。 (同样,例如,它们不允许您要求属性使用单引号而不是双引号,或者在“=”符号周围添加空格。)

    【讨论】:

      【解决方案3】:

      在许多 XQuery 3.0 处理器(BaseX、Saxon 等)中,可以将“html”指定为序列化选项,它将以预期的方式输出空元素:

      declare namespace output = "http://www.w3.org/2010/xslt-xquery-serialization";
      declare option output:method "html";
      <TAG ID="abc"></TAG>
      

      但是,我不知道 SQL Server 何时/是否支持 XQuery 3.0,或者它是否提供了另一种更改序列化默认值的方法。

      【讨论】:

      • 如果我有关注 DECLARE @X XML SET @X = '&lt;TAG ID="abc"&gt;&lt;/TAG&gt;' SELECT @X 我如何添加你的代码?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多