问题标签 [schematron]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
maven - 针对 XML 文件执行检查,例如 Oracle OSB 文件和 Soap-UI 测试文件
寻找一种我们可以检查 XML 文件的方法,而不仅仅是模式验证。找到了一些对 Schematron 的引用,看起来很有趣,但很难看到我们如何将这一切拼凑起来:
问题背景
我们正在处理只生成一大堆 XML 文件的 Oracle OSB。我们还生产用于集成测试的 Soap-UI 测试套件。
我们刚刚开始正式制定我们的编码标准和开发指南,这些东西在执行代码审查时为我们提供了指导。然而,很多这些检查真的觉得它们可以自动化。很像 checkstyle 如何在我们的 java 代码中进行检查。
例如,在我们的 Soap-UI 测试中,我们希望确保每个soap 请求都有Schema Compliance 和Soap Response 的断言。这个“检查”可以写成一个非常简单的 xpath。
我们的 OSB 中的类似检查生成了 XML,例如确保变量符合驼峰命名法、资源路径不引用项目外部的文件、存在顶级错误处理。
理想的解决方案
我们已经在 maven 中运行了构建,soap-ui 测试正在吐出肯定格式的报告。我们使用 jenkins 作为我们的 CI 服务器,它能够获取这些可靠的报告,因此我们可以轻松查看测试结果并了解构建失败的原因。
我们希望找到可以为我们执行这些检查的东西,并让它们在 jenkins 中干净地报告。
到目前为止我能想到的最好的:
- 让 maven 运行运行 schematron 检查的 ant 任务
- 找到一种将 schematron 输出转换为安全输出的方法
- 修改 jenkins maven-runner 以获取生成的肯定报告
但感觉就像我被困在了这里的兔子洞里。如果这是解决此问题的正确方法,我认为其他人已经解决了这个问题,但很难找到任何关于将 schematron 与 CI 工具或 maven 集成的有用信息。
schematron 值得研究吗?
是否有其他工具可以更紧密地与我们现有的设置集成,更适合?
xml - 如果类型等于某个类型或从该类型派生,如何检查 xPath
我正在使用 Schematron 中的 xPath。我能够检查一个类型是否等于一个目标类型。例如'xsd:string eq xsd:string'。
如何检查用户定义的类型是否派生自 xsd:string?我试过了:
但它不起作用。
xml - 如何在 Visual Studio 中使用 schematron 验证?
我想根据我拥有的 schematron 文件验证 XML 文件。是否可以通过 Visual Studio 2010 做到这一点?
当我在 Visual Studio 中打开 XML 文件时,我可以添加已定义架构的 XSD 文件,但我想根据我在单独的 sch 文件中的 schematron 规则进行验证。
xml - 使用 schematron 验证二进制文件的存在
我想使用 schematron 来验证测试文档中指定的文件是否确实存在。文档和文件将始终位于同一目录中。例如:
在与正在验证的文档相同的目录中存在名为“bar.png”的文件应该通过。
到目前为止,我的研究使我相信这甚至是不可能的。
我正在使用 Saxon EE 9.3 虽然 oXygen XML 和 XSLT 2.0。
java - 无法使用 java XSLT 处理器从 Schematron 模式生成有效的 XSL 样式表
我正在尝试使用 schematron 验证我的实例文档,并且在 Java XSLT 处理器实现方面遇到了问题。当我尝试从我的 schematron 生成一个 XSL 时,即使是一个简单的,我得到的结果与我期望的不同。
当使用 xsltproc (cygwin) 进行转换时,一切正常。但是使用 Saxon-B 9.1.0.8,默认的 java 1.6 实现或带有 Saxon-PE 9.3.0.5 的 Oxygen IDE 的 XSLT 调试器会生成一个无效的 XSL 文件。原因是包含前缀的元素的extension-element-prefixes
属性,没有在任何地方声明名称空间。这样的样式表在使用时必然会失败。xsl:stylesheet
exsl
手动编辑生成的文件是不可能的,因为 schematron 是在运行时在应用程序中生成的。我一定是做错了什么,对吧?我已经将问题追踪到了iso_schematron_skeleton_for_saxon.xsl
(或者iso_schematron_skeleton_for_xslt1.xsl
,取决于所使用的实现,是的,我都尝试了相同的最终结果)。尽管骨架清楚地创建了一个带有缺失名称空间的正确样式表,但它后来以某种方式神奇地被移除了。我不是真正的 XSLT 专家,所以我不知道我在这里做错了什么。我敢肯定这只是我在某个地方错过的一些愚蠢的事情。我想知道为什么下面输入的输出不同。
这是一个示例 schematron,它只定义了一些命名空间(我希望这被认为是一个有效的模式):
这是我从 Java XSLT 处理器获得的片段(这个来自 Oxygen,无论使用 xslt1 还是 xslt2 的 iso,问题仍然存在):
以下是 xsltproc 生成的内容,以及我希望 java 生成的内容:
如您所见,Java 输出缺少对应前缀的 exsl 命名空间。我意识到应该处理命名空间的iso骨架部分被标记为实验性的。如果有必要,我愿意应用肮脏的黑客来让它工作(除非我因为没有深入学习schematron而问一些尴尬的事情)。有任何想法吗?
编辑:正如 Martin 在下面的评论中建议的那样,我尝试使用纯 XSLT 1.0 处理器。我使用了 xalan(编译版和解释版)和 saxon 6.5.5。两个 xalans 都没有附加 exsl 命名空间。Saxon 甚至无法处理带有“添加属性后无法添加名称空间”或类似内容的 schematron(xslt1 的 iso 框架中的第 1534 行)。对我来说,唯一能够使用 queryBinding="exslt" 转换 schematron 的处理器仍然是 xsltproc。它也是我尝试过的唯一非 Java 处理器。在阅读了一些有问题的 XSL 之后,我注意到一条评论,其中声称该转换已使用 saxon9 进行了测试。所以这应该有效。
PS:为长篇文章道歉,但我认为举个例子很重要。
xml - 如何使用 Schematron 验证 xml 属性不应包含时区信息?
如何使用 Schematron 验证所有 'signedWhen' xml 属性不应包含时区信息?我正在使用使用 XPath 1.0 的 .NET 实现。
给定源 XML:
在 XSD 文件中使用此 Schematron 规则:
给出这些不正确的结果
它不应该返回任何结果,因为没有时区信息。
编辑1:
我想到了。我在测试中没有正确使用 XPath 1.0 函数“子字符串”。
编辑 2: W3schools 对 xs:date 和 xs:dateTime 的定义没有提到可选负签名年份的可能性。所以我上面的代码不起作用,请参阅下面选择的答案。
编辑 3: 好吧,我使用的模式 (xmlns:xs="http://www.w3.org/2001/XMLSchema" ) 不接受负符号年份 - 并声明它无效。但为了安全起见,我将从现在开始使用此代码:
xml - 如何使用 XPath 1.0 在 Schematron 中重用断言测试?
如何使用 XPath 1.0 重用 Schematron 断言测试?具体来说,如何使用找到的属性名称重用测试。如果我不能这样做,我想重用一个测试,并且对每个命名属性只进行一个测试。(我认为只有 XPath 2.0 可以使用变量)。正如您从 XSD 架构中看到的那样,我进行了相同的测试,但使用了不同的属性名称。注意:我知道时区测试不是万无一失的,这只是一个例子。
给定 XML:
给定 XSD:
xml - 如何使用 Schematron 和 XPath 1.0 验证 XML 中相同数据类型 (xs:date) 的所有元素和属性
如何在一次测试中使用 Schematron 和 XPath 1.0 验证 XML 中相同数据类型的所有元素和属性(例如:xs:dateTime)?
我知道您可以为此创建多个测试,但我如何才能测试所有日期(xs:dateTime),然后向用户报告哪个元素或属性有问题?下面是一个示例,它测试了具有特定命名属性“signedWhen”的所有元素。但是属性名称并不总是相同的,有时 xs:dateTime 是一个元素......
XSD 文件中的 Schematron 测试:
java - 如何使用 Saxon java 库命令行工具执行 schematron 验证?
非常基本的问题 - 我有一个 xml 文件,我想根据 schematron 文件对其进行验证。如何使用 Saxon 命令行进行操作?
根据命令行参考,我没有看到任何指定 schematron 文件的选项。
xml - XSLT1.0+Schematron:翻译实例文本 XPath 值,以便在 XSLT 转换期间动态评估它们
我正在使用 Schematron 在自定义模式感知 XML 编辑器中验证实例 XML 文档(请注意,Schematron 验证只是一个 XSLT 转换)。该实例可能包含在其值中带有路径的元素(简化的 XPath 表达式)。这种路径的一个例子是:
其中两个前缀(p 和 r)都绑定到实例文档中定义的命名空间。我的 Schematron 通过确保路径指向的元素实际存在于实例文档中来验证此类路径。它依赖EXSLT来执行此操作(我被迫使用 XSLT1.0),更准确地说dyn:evaluate()
是为了评估元素的文本值,如您所见,它基本上是一个 XPath 表达式。它就像一个魅力。
但有一个问题,实际上是一个巨大的问题。调用从 Schematron XSLT 执行,该 XSLT在它自己的命名空间上下文中dyn:evaluate()
评估 XPath 表达式。这意味着为了使其正常工作,实例文档和 Schematron XSLT 必须使用完全相同的前缀 → 命名空间捆绑。我不能强制用户对我的架构中指定的相同命名空间使用相同的前缀......这将是一个愚蠢的要求(但确保至少在两者中使用相同的命名空间)。Schematron 总是在实例验证发生之前生成,但出于性能原因,这只执行一次。我唯一的选择是以某种方式预处理来自实例的路径,并进行某种从“实例路径”到“XSLT 路径”的转换。我是 XSLT 的新手,不知道如何实现这一点。
我如何将这些文本值转换为 XSLT 的名称空间上下文所需的内容?这甚至可能吗?我目前正在考虑在每次验证调用之前在内存中修复 XSLT(所有这些都在 Java 中完成)——重命名前缀以使其匹配实例绑定或注入新的命名空间属性——但这可能导致前缀名称冲突,我'不确定它将如何影响验证性能。我愿意接受任何建议,因为我假设这也是其他人必须遇到的事情(在使用 Schematron 或 时dyn:evaluate()
)。
编辑:从这里开始澄清我正在尝试做的事情。
我有一个用户正在编辑器中编辑的 XML 实例文件。这种文件的一个例子是:
然后,这样的文档会通过 schematron 验证,这基本上是一个 XSLT 转换。ns1:some-element
只有当路径 in引用同一文档中的现有元素时,它才会被声明为有效(因此上面的示例是有效的)。
schematron XSLT 看起来像这样(注意它已经被大大简化了):
我确信这可以解释问题。调用dyn:evaluate(.)
将尝试评估/cfg:config/ns1:other-element/ns2:nested-element
XPath 表达式,该表达式使用来自转换的预定义的未绑定前缀(因此始终评估为 false)。
问题过去和现在仍然是:如何翻译这些 XPath 表达式,以便它们在转换中真正有意义?