具有Saxon API的XQuery / XPath-需要区分大小写的路径

时间:2018-09-19 23:37:12

标签: c# xpath xquery collation saxon

简而言之,我希望以下所有路径的值都相同:

  • / root / item1 / text()
  • / ROOT / ITEM1 / text()
  • / Root / Item1 / text()

据我了解,其想法是将大小写不同的XML节点实际上视为不同的。这里的问题是我正在基于一组关系SQL DB表构建一个动态XML构建器。该应用程序将安装在50多个具有自己的SQL实例的不同服务器上。 50%的表结构,名称和类型会有所不同,而其他50%的名称可能会有所不同。目标是将标准XQuery转换应用于具有自定义AND标准部分的这些动态生成的XML文件,这意味着它适用于所有50台以上的服务器。这就是为什么我一直在寻找不区分大小写的路径逻辑,即使它违反了XML的基本原理,也为我们的用例“选择”加入这样的功能提供了巨大的好处。

我目前进行测试的一个有用的解决方法是使用XSLT进行预转换,以将所有元素节点名称转换为小写形式。因此,如果没有任何结果,那么至少它仍然会足够可行。

我是XQuery / XPath / XSLT的新手,所以名称空间对我来说仍然是一个陌生的概念。我偶然发现的一件事是宣布排序规则。但是我不能说这是否仅用于典型的字符串比较($ x = $ y)或其他类似的事情。撒克逊人有一个内置的处理器方法,称为Processor.DeclareCollat​​ion(),我尝试使用它,但是我没有注意到查询的运行方式有所不同。

核对是我的答案,而仅仅是如何设置它的问题(在此之前从来没有真正弄过它)?还有另一种解决方法吗?还是应该坚持使用已有的解决方案?

* P.S。具有不区分大小写的函数名称也将是一个很棒的奖励[text()vs TEXT()],但我可以没有它,这对我团队中的nooblets减少错误有帮助。 :)

2 个答案:

答案 0 :(得分:3)

此XPath,

/*[lower-case(name()) = "root"]/*[lower-case(name()) = "item1"]/text()

将以不区分大小写的方式介绍您的示例。

注释:

  1. 请不要这样做。 XML在设计和标准化上都区分大小写。
  2. 不,没有声明不区分大小写的全局方法。参见#1。
  3. 不,该标准不应屈服于特殊的设计;特质的设计应该让它屈服。

答案 1 :(得分:1)

XML本质上区分大小写。在编写必须处理变体输入格式的转换时,我通常的建议是将它们编写为管道,其中第一阶段消除了不必要的变体,以便“业务逻辑”阶段可以专注于一项任务而不会分散其他注意力输入表示形式。

从本质上讲,这就是@MadsHansen提出的解决方案。

另一种方法(在Saxon中)可能很整洁,尽管有点复杂:您可以实现一个自定义树模型,其中元素和属性的名称以规范化的大小写形式显示,而隐藏基础中的任何大小写变化数据。 Saxon中有很多机制可以将自定义树模型实现为其他树模型的包装器,因此实际上并不需要大量代码。但是充分熟悉Saxon的内部知识以使其正常工作将是一个巨大的挑战。

不过,我的真正建议不是从这里开始。您设计XML词汇表的方式被误导了。在XML中,“Straße”和“ STRASSE”是不同的名称,所有XML工具都将它们视为不同的名称,并且如果您想将它们作为替代的书写相同名称的方式,那么您将违背自然流程,这总是增加复杂性和成本。

在XPath中,归类对于比较用户数据很有用:您可以采用一种归类,其中当字符串“Straße”和“ STRASSE”出现在元素和属性的文本内容中时,它们被认为是等效的。但是在比较元素名称和属性名称时永远不会使用它们。