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
,因为只有在测试失败时才会出现修复。
有谁知道如何在文本节点有子节点时删除尾随句点和 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
,因为只有在测试失败时才会出现修复。