Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何验证XSLT模板';是针对XML模式的逻辑吗?_Xml_Xslt_Xsd - Fatal编程技术网

如何验证XSLT模板';是针对XML模式的逻辑吗?

如何验证XSLT模板';是针对XML模式的逻辑吗?,xml,xslt,xsd,Xml,Xslt,Xsd,XSLT转换对正在转换的XML的结构进行隐式假设。例如,以下各项: <xsl:variable name="b"><xsl:value-of select="A/B"/></xsl:variable> 假设XML节点“B”位于“A”的正下方,例如: <A> <B>Hello</B> <\A> 似乎只提到验证输入XML和生成的XML(而不是XSLT本身) [虽然一种方法可能是创建XSLT所期望的XML模

XSLT转换对正在转换的XML的结构进行隐式假设。例如,以下各项:

<xsl:variable name="b"><xsl:value-of select="A/B"/></xsl:variable>

假设XML节点“B”位于“A”的正下方,例如:

<A>
  <B>Hello</B>
<\A>
似乎只提到验证输入XML和生成的XML(而不是XSLT本身)


[虽然一种方法可能是创建XSLT所期望的XML模式,然后将输入XML与之进行比较,但我有100个不同版本的XSLT,因此这是不切实际的。但是,创建输入的XSD并询问XSLT是否同意这一点很简单。]

XSLT 2.0/3.0中的模式感知处理就是为了实现这一点而设计的

在模板规则的匹配模式中,您必须声明仅将其用于处理架构有效元素:

<xsl:template match="schema-element(invoice)">
 ...
</xsl:template>

...
或者在XSLT 3.0中,您可以声明模式中的所有模板规则都是为处理模式有效输入而设计的:

<xsl:mode typed="strict"/>

然后,如果您使用的路径根据模式是不存在的,例如

<xsl:template match="schema-element(invoice)">
 <xsl:apply-templates select="customer-detials"/>
</xsl:template>

XSLT处理器将告诉您这一点。您必须使用
声明告诉XSLT处理器在哪里找到模式


图式意识是语言中一个未被充分利用的特征。它需要一点前期工作来利用它,有时可能会遇到一些“误报”错误消息的麻烦,但一旦掌握了窍门,它就可以捕获大量简单的用户错误,否则将花费数小时进行调试。在某些情况下,模式感知还可以通过减少需要搜索的源文档数量和避免重复的数据类型转换来提高性能,但更好的静态错误检查是主要的好处。

XSLT 2.0/3.0中的模式感知处理就是为了实现这一点而设计的

在模板规则的匹配模式中,您必须声明仅将其用于处理架构有效元素:

<xsl:template match="schema-element(invoice)">
 ...
</xsl:template>

...
或者在XSLT 3.0中,您可以声明模式中的所有模板规则都是为处理模式有效输入而设计的:

<xsl:mode typed="strict"/>

然后,如果您使用的路径根据模式是不存在的,例如

<xsl:template match="schema-element(invoice)">
 <xsl:apply-templates select="customer-detials"/>
</xsl:template>

XSLT处理器将告诉您这一点。您必须使用
声明告诉XSLT处理器在哪里找到模式


图式意识是语言中一个未被充分利用的特征。它需要一点前期工作来利用它,有时可能会遇到一些“误报”错误消息的麻烦,但一旦掌握了窍门,它就可以捕获大量简单的用户错误,否则将花费数小时进行调试。在某些情况下,模式感知还可以帮助提高性能,减少需要搜索的源文档数量,避免重复的数据类型转换,但更好的静态错误检查是主要好处。

您显示的代码片段甚至不是模板,所以我不确定您的问题是什么“验证XSLT模板的逻辑“指。对于创建临时节点并进一步处理它们的样式表,您希望发生什么?路径
A/B
甚至不指示任何架构类型。至于您的总体想法,我认为Saxon EE和正确的工具都支持这一点,请参见示例说明。谢谢,@MartinHonnen-该链接很有用,但由于我拥有100多个XSLT表,我不知道如何重新编写它们(除非我能够以编程方式编写,甚至在那时……)。我给出的示例只是一个示例片段,因此不是完整的XSLT文档@MartinHonnen-我可以检查一下我的解释吗?它是否只要求根据模板进行“匹配”,然后对其下的任何内容进行验证?换句话说,只需要两个修改:引用模板和对初始匹配语句使用“match=”schema element(result)”?据我所知,那篇文章中解释的警告是Saxon EE的一个特性。我认为很明显,只有在引用模式组件的情况下才可能出现此类警告,我恐怕对Saxon的这一特性还不够熟悉,当然对它的实现也没有任何帮助。如果你在Saxonica论坛上提问或者用Saxon标记你的问题,我相信@MichaelKay能够并且会告诉你更多。你展示的片段甚至不是一个模板,所以我不确定你的问题“验证XSLT模板的逻辑”指的是什么。对于创建临时节点并进一步处理它们的样式表,您希望发生什么?路径
A/B
甚至不指示任何架构类型。至于您的总体想法,我认为Saxon EE和正确的工具都支持这一点,请参见示例说明。谢谢,@MartinHonnen-该链接很有用,但由于我拥有100多个XSLT表,我不知道如何重新编写它们(除非我能够以编程方式编写,甚至在那时……)。我给出的示例只是一个示例片段,因此不是完整的XSLT文档@MartinHonnen-我可以检查一下我的解释吗?它是否只要求根据模板进行“匹配”,然后对其下的任何内容进行验证?换句话说,只需要两个修改:引用模板和对初始匹配语句使用“match=”schema element(result)”?据我所知,那篇文章中解释的警告是Saxon EE的一个特性。我认为很明显,只有在引用模式组件的情况下才可能出现此类警告,我恐怕对Saxon的这一特性还不够熟悉,当然对它的实现也没有任何帮助。我相信@MichaelKay能够并且会告诉你更多,如果你在萨克森卡问的话