首页 > 解决方案 > 使用 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>

问候, 希尔

标签: schematron

解决方案


好的,假设您的意思是元素的索引“大于 2” li,您可以执行以下操作:

  1. 将上下文设置li[position() gt 2]为仅获取li位置大于 2 的元素。
  2. 检查是否有ph元素。
  3. sqf:fixli元素开始展开。

解决方案如下所示:

    <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 可以立即进行解包。


推荐阅读