是否有可能在 schematron 规则中获得完整的 xpath?
Is it possible to get the full xpath within a schematron rule?
我想在抽象的 schematron 规则中输出一些上下文。
例子XML
...
<xpath>
<to>
<search>Content</search>
</to>
</xpath>
Schematron
<sch:rule context="$element">
<sch:report test="true()">
<sch:value-of select="$element"/>
</sch:report>
</sch:rule>
<sch:pattern id="tests-1" is-a="test">
<sch:param name="element" value="//xpath//to//search"/>
</sch:pattern>
...
Outputs Content
, 有没有得到传入的xpath值//xpath//to//search
?
为此,您需要一个抽象 Schematron pattern。所以这个
<sch:pattern id="test" abstract="true">
<sch:rule context="$element">
<sch:report test="true()">
<sch:value-of select="$element"/>
</sch:report>
</sch:rule>
</sch:pattern>
<sch:pattern id="tests-1" is-a="test">
<sch:param name="element" value="//xpath//to//search"/>
</sch:pattern>
应该可以。
编辑: 请注意,您的示例表达式应该有效,但并非每个 XPath 表达式都允许在 sch:rule
的 @context
中使用(实际上是称为 XSLT 模式)。
允许的表达式:
//node
node/to/path
node/to/@attribute
node[following-sibling::any/xpath or function-call()]
node|otherNode
禁止的表达方式:
/node/following-sibling::other/node
//node/ancestor::node
function-call()
to/be or not/to/be
在此处阅读更多内容:https://www.w3.org/TR/xslt20/#patterns
EDIT2:如果您想将 non-evaluated XPath 表达式本身作为错误消息,您可以使用:
<sch:report test="true()">
<sch:value-of select=" '$element' "/>
</sch:report>
这行得通,因为在计算 XPath 表达式之前将替换抽象模式的参数。
请注意,这仅在 XPath 表达式本身不包含引号(例如 node[@attribute = 'value']
)时有效。
如果您使用 Schematron 的 XSLT-based 参考实现生成 SVRL 输出,则 SVRL 将包含成功报告上下文的 XPath,如下所示:
<svrl:successful-report ... location="[this is where the XPath will be]">
如果这不能满足您的需要,您仍然需要获取节点的 XPath,并且您正在使用 XSLT-based 参考实现,您可以利用定义的 XSL 模板在实现中,像这样:
<sch:pattern>
<sch:rule context="//xpath//to//search">
<sch:report test="true()">
<xsl:apply-templates select="." mode="schematron-get-full-path"/>
</sch:report>
</sch:rule>
</sch:pattern>
为此,在将 Schematron 模式编译为 XSLT 时必须使用 allow-foreign
参数,如果您使用的是 Saxon,则如下所示:
[path/to/saxon/]Transform
–xsl:iso-schematron-xslt2\iso_svrl_for_xslt2.xsl
–s:[SchematronFile2.sch]
–o:[SchematronFile.xsl]
allow-foreign=true
这种方法会使您的 Schematron 模式依赖于 Schematron 的 XSLT-based 参考实现。其他实现可能没有必要的 XSL 模板。
我想在抽象的 schematron 规则中输出一些上下文。
例子XML
...
<xpath>
<to>
<search>Content</search>
</to>
</xpath>
Schematron
<sch:rule context="$element">
<sch:report test="true()">
<sch:value-of select="$element"/>
</sch:report>
</sch:rule>
<sch:pattern id="tests-1" is-a="test">
<sch:param name="element" value="//xpath//to//search"/>
</sch:pattern>
...
Outputs Content
, 有没有得到传入的xpath值//xpath//to//search
?
为此,您需要一个抽象 Schematron pattern。所以这个
<sch:pattern id="test" abstract="true">
<sch:rule context="$element">
<sch:report test="true()">
<sch:value-of select="$element"/>
</sch:report>
</sch:rule>
</sch:pattern>
<sch:pattern id="tests-1" is-a="test">
<sch:param name="element" value="//xpath//to//search"/>
</sch:pattern>
应该可以。
编辑: 请注意,您的示例表达式应该有效,但并非每个 XPath 表达式都允许在 sch:rule
的 @context
中使用(实际上是称为 XSLT 模式)。
允许的表达式:
//node
node/to/path
node/to/@attribute
node[following-sibling::any/xpath or function-call()]
node|otherNode
禁止的表达方式:
/node/following-sibling::other/node
//node/ancestor::node
function-call()
to/be or not/to/be
在此处阅读更多内容:https://www.w3.org/TR/xslt20/#patterns
EDIT2:如果您想将 non-evaluated XPath 表达式本身作为错误消息,您可以使用:
<sch:report test="true()">
<sch:value-of select=" '$element' "/>
</sch:report>
这行得通,因为在计算 XPath 表达式之前将替换抽象模式的参数。
请注意,这仅在 XPath 表达式本身不包含引号(例如 node[@attribute = 'value']
)时有效。
如果您使用 Schematron 的 XSLT-based 参考实现生成 SVRL 输出,则 SVRL 将包含成功报告上下文的 XPath,如下所示:
<svrl:successful-report ... location="[this is where the XPath will be]">
如果这不能满足您的需要,您仍然需要获取节点的 XPath,并且您正在使用 XSLT-based 参考实现,您可以利用定义的 XSL 模板在实现中,像这样:
<sch:pattern>
<sch:rule context="//xpath//to//search">
<sch:report test="true()">
<xsl:apply-templates select="." mode="schematron-get-full-path"/>
</sch:report>
</sch:rule>
</sch:pattern>
为此,在将 Schematron 模式编译为 XSLT 时必须使用 allow-foreign
参数,如果您使用的是 Saxon,则如下所示:
[path/to/saxon/]Transform
–xsl:iso-schematron-xslt2\iso_svrl_for_xslt2.xsl
–s:[SchematronFile2.sch]
–o:[SchematronFile.xsl]
allow-foreign=true
这种方法会使您的 Schematron 模式依赖于 Schematron 的 XSLT-based 参考实现。其他实现可能没有必要的 XSL 模板。