String 将字符串强制转换为路径表达式-Schematron

String 将字符串强制转换为路径表达式-Schematron,string,casting,path,schematron,String,Casting,Path,Schematron,伙计们 我正在使用schematron,需要执行以下操作: 有时在我想要验证的xml文档中,有如下元素: <Var.X name="B"> <Var> <Obj name="X"> </Var> 对于这些元素(name()中间有一个点),我需要在xml文件中查看是否有一个名为Var的目录,其子元素的属性name=X(在本例中),如下所示: <Var.X name="B"> <Var> <Obj n

伙计们

我正在使用schematron,需要执行以下操作:

有时在我想要验证的xml文档中,有如下元素:

<Var.X name="B">
<Var>
   <Obj name="X">
</Var>

对于这些元素(name()中间有一个点),我需要在xml文件中查看是否有一个名为Var的目录,其子元素的属性name=X(在本例中),如下所示:

<Var.X name="B">
<Var>
   <Obj name="X">
</Var>

我考虑将这些对象的name()转换为表示路径的字符串,因此在本例中:

变量X将是/*/Var/child::*[@name=“X”]

有了这个字符串,我想检查,实际上,是否有一个元素属于字符串所代表的路径,但我不能将字符串转换为路径类型,我甚至不知道这是否可能


有更简单的方法吗?

我意识到我想用saxon实现的是:计算函数。。。我已经实现了我想要的

我意识到我想要实现的是用saxon完成的:求值函数。。。而且我已经实现了我想要的

您也可以使用name函数,而无需saxon扩展

<rule context="*[matches(name(),'\w\.\w')]">
    <let name="beforePoint" value="substring-before(name(),'.')"/>
    <let name="afterPoint" value="substring-after(name(),'.')"/>
    <assert test="/*/*[name() = $beforePoint]/*[@name=$afterPoint]">error message</assert>
</rule>

错误消息

您也可以在不使用saxon扩展名的情况下使用name函数

<rule context="*[matches(name(),'\w\.\w')]">
    <let name="beforePoint" value="substring-before(name(),'.')"/>
    <let name="afterPoint" value="substring-after(name(),'.')"/>
    <assert test="/*/*[name() = $beforePoint]/*[@name=$afterPoint]">error message</assert>
</rule>

错误消息