schematron - 使用 Schematron 验证 XML
问题描述
我有以下 xml,我想解开大于 2 的 ph 元素。
输入:(xml)
<ul>
<li>
<ph>123</ph>
</li>
<li>
<ph>456</ph>
</li>
<li>
<ph>abc</ph>
</li>
<li>
<ph>xyz</ph>
</li>
</ul>
输出/输出:
<ul>
<li>
<ph>123</ph>
</li>
<li>
<ph>456</ph>
</li>
<li>
abc
</li>
<li>
xyz
</li>
</ul>
并且下面的代码无法获得所需的输出
<sch:pattern>
<sch:rule context="*/ph" role="error">
<sch:assert test="not(node()>2)" sqf:fix="unwrap"><sch:name/> element not
allowed</sch:assert>
<sqf:fix id="unwrap">
<sqf:description>
<sqf:title>unwrap <sch:name/> element</sqf:title>
</sqf:description>
<sqf:replace select="node()"></sqf:replace>
</sqf:fix>
</sch:rule>
问候, 希尔
解决方案
好的,假设您的意思是元素的索引“大于 2” li
,您可以执行以下操作:
- 将上下文设置
li[position() gt 2]
为仅获取li
位置大于 2 的元素。 - 检查是否有
ph
元素。 sqf:fix
从li
元素开始展开。
解决方案如下所示:
<sch:rule context="li[position() gt 2]">
<sch:report test="ph" sqf:fix="unwrap">ph element not allowed.</sch:report>
<sqf:fix id="unwrap">
<sqf:description>
<sqf:title>Unwrap ph element.</sqf:title>
</sqf:description>
<sqf:replace match="ph" select="node()"/>
</sqf:fix>
</sch:rule>
另一种方法是将上下文设置为ul
. 在这种情况下,您只会收到一条错误消息,并且 QuickFix 可以立即进行解包。
推荐阅读
- laravel - 直接在 Laravel 中运行 artisan 命令时创建日志文件
- python-3.x - Django 定义了一个模型,但模型的某些字段不起作用
- c# - await Task.Delay() 在使用 MVVMCross 的 Xamarin.iOS 上不起作用
- ios - 为什么在 ionic4 的 xcode 中会出现此错误
- android - 我正在尝试在 android 中使用毫秒发送通知?
- javascript - 将箭头功能更改为正常功能?
- django - 如何在 django 中进行模型级自定义字段验证?
- python - 对文件中的行使用正则表达式
- kotlin - Kotlin 多变量 Null 检查器方法实现
- java - 用不同的变量名复制相同的 JLabel