是否有可能在schematron规则中获得完整的xpath?

时间:2018-04-04 15:32:10

标签: xml xpath schematron

我想在抽象的schematron规则中输出一些上下文。

示例XML

if(args.node.children.length==0)
{
    args.content[6] = ""
}

的Schematron

...
<xpath>
    <to>
        <search>Content</search>
    </to>
</xpath>

输出<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> ... ,无论如何都要传递xpath值Content

2 个答案:

答案 0 :(得分:1)

您需要一个抽象的Schematron 模式。所以这个

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

应该有用。

编辑:请注意,您的示例表达式应该可以使用,但@context的{​​{1}}中不允许每个XPath表达式(实际上它称为XSLT模式)。

允许的表达式:

sch:rule

禁止表达:

//node
node/to/path
node/to/@attribute
node[following-sibling::any/xpath or function-call()]
node|otherNode

在此处阅读更多内容:https://www.w3.org/TR/xslt20/#patterns

EDIT2 :如果您想将非评估的XPath表达式作为错误消息自行使用,您可以使用:

/node/following-sibling::other/node
//node/ancestor::node
function-call()
to/be or not/to/be

这很有效,因为抽象模式的参数将在评估XPath表达式之前被替换。

请注意,这仅适用于其自身的XPath表达式不包含引号(例如<sch:report test="true()"> <sch:value-of select=" '$element' "/> </sch:report> )。

答案 1 :(得分:1)

如果您使用基于XSLT的Schematron参考实现来生成SVRL输出,那么SVRL将包含成功报告上下文的XPath,如下所示:

<svrl:successful-report ... location="[this is where the XPath will be]">

如果这不能满足您的需求并且您仍然需要获取节点的XPath,并且您正在使用基于XSLT的参考实现,那么您可以利用实现中定义的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的参考实现。其他实现可能没有必要的XSL模板。