проверить XML с помощью Schematron - PullRequest
0 голосов
/ 28 мая 2019

У меня есть следующий xml, и я хотел бы развернуть элемент ph, который больше 2.

Ввод: (xml)

<ul>
 <li>
   <ph>123</ph>
 </li>
 <li>
   <ph>456</ph>
 </li>
 <li>
   <ph>abc</ph>
 </li>
<li>
<ph>xyz</ph>
</li>
</ul>

O / P:

<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 ]

0 голосов
/ 05 июня 2019
 <sch:pattern>
        <sch:rule context="li[position() &gt; 2]">
            <xsl:variable name="offendingph">
                <xsl:for-each select="child::ph">                
                        <xsl:value-of select="node()"/>
               </xsl:for-each>
            </xsl:variable>                    
            <sch:report test="child::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="$offendingph"/>
            </sqf:fix>
        </sch:rule>
    </sch:pattern>
0 голосов
/ 31 мая 2019

Хорошо, предполагая, что вы имеете в виду «больше 2» индекса элементов li, вы можете сделать следующее:

  1. Установить контекст на li[position() gt 2], чтобы получить толькоli элементов с позицией, превышающей 2.
  2. Проверьте, есть ли элемент ph.
  3. Разверните 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 может выполнить развертывание сразу.

...