使用 Schematron 验证 XML
validate XML with Schematron
我有以下 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>
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>
此致,
石
好的,假设您的意思是 "greater than 2" li
元素的索引,您可以执行以下操作:
- 将上下文设置为
li[position() gt 2]
以仅获取位置大于 2 的 li
个元素。
- 检查是否有
ph
元素。
- 从
li
元素开始展开 sqf:fix
。
解决方案如下所示:
<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 可以立即解包。
<sch:pattern>
<sch:rule context="li[position() > 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>
我有以下 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>
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>
此致, 石
好的,假设您的意思是 "greater than 2" li
元素的索引,您可以执行以下操作:
- 将上下文设置为
li[position() gt 2]
以仅获取位置大于 2 的li
个元素。 - 检查是否有
ph
元素。 - 从
li
元素开始展开sqf:fix
。
解决方案如下所示:
<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 可以立即解包。
<sch:pattern>
<sch:rule context="li[position() > 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>