Schematron 条尾部句号和文末的 space

Schematron strip trailing period and space at the end of the text

有谁知道如何在文本节点有子节点时删除尾随句点和 space?

i/p xml:

   <ul>
     <li>example1. </li>
     <li>example2.</li>
      <li>xyz size. <ph>567</ph> 1. <ph>9</ph>mm.</li>
      <li>abc size. <ph>1234</ph> 1. <ph>9</ph>mm. </li>
      <li>def size.<ph>123</ph> 3.<ph>5</ph>mm.</li>
   </ul>

当文本包含子元素时,以下代码无法正常工作。

Schematron:

       <sch:pattern>
        <sch:rule context="li//text()">
            <sch:report test="matches(., '(\w+)\.\s*$')" sqf:fix="listPeriod" role="warning">List
                should not end with a period</sch:report>
            <sqf:fix id="listPeriod" use-when="matches(., '(\w+)\.\s*$')">
                <sqf:description>
                    <sqf:title>Remove end period</sqf:title>
                </sqf:description>
                <sqf:stringReplace regex="(\w+)\.\s*$" select="''"/>
            </sqf:fix>
        </sch:rule>
    </sch:pattern>

o/p:

   <ul>
      <li>example1</li>
      <li>example2</li>
      <li>xyz size<ph>567</ph> 1<ph>9</ph>mm</li>
      <li>abc size<ph>1234</ph> 1<ph>9</ph>mm</li>
      <li>def size<ph>123</ph> 3<ph>5</ph>mm</li>
   </ul>

想要o/p:

   <ul>
     <li>example1</li>
     <li>example2</li>
      <li>xyz size. <ph>567</ph> 1. <ph>9</ph>mm</li>
      <li>abc size. <ph>1234</ph> 1. <ph>9</ph>mm</li>
      <li>def size.<ph>123</ph> 3.<ph>5</ph>mm</li>
   </ul>

谢谢!!

修复 mixed-content 总是很困难,但在您的情况下,您可以只修复 li 元素中的最后一个文本节点。

首先,您应该使用 li 作为上下文来一次测试内容,而不是里面的每个文本节点:

<sch:rule context="li">

您应该在 sqf:stringReplace 中添加一个 match,仅修复其中的最后一个文本节点:

<sqf:stringReplace  match="(.//text())[last()]"/>

这就是整个模式:

<sch:pattern>
    <sch:rule context="li">
        <sch:report test="matches(., '(\w+)\.\s*$')" sqf:fix="listPeriod" role="warning">List
            should not end with a period</sch:report>
        <sqf:fix id="listPeriod">
            <sqf:description>
                <sqf:title>Remove end period</sqf:title>
            </sqf:description>
            <sqf:stringReplace regex="(\w+)\.\s*$" match="(.//text())[last()]" select="''"/>
        </sqf:fix>
    </sch:rule>
</sch:pattern>

注意:您可以跳过 use-when,因为只有在测试失败时才会出现修复。