XSLT转换对它正在转换的XML结构做出隐式假设。例如,以下内容:
<xsl:variable name="b"><xsl:value-of select="A/B"/></xsl:variable>
假设XML节点&#34; B&#34;直接坐在&#34; A&#34;下面,例如:
<A>
<B>Hello</B>
<\A>
如果XML格式已更改,则变为:
<A>
<AA>
<B>Hello</B>
</AA>
<\A>
XSLT现在无法找到节点B,并假设在这种情况下没有指定节点(这将是一个有效的选项)。
我曾假设可以指定XSLT尝试转换的XML架构,如果XSLT曾引用架构无法识别的节点,则会引发验证错误。但是,我似乎无法找到这种实现(https://www.ibm.com/developerworks/library/x-schemaxslt/index.html似乎只提到验证输入XML和生成的XML - 而不是XSLT本身。)
[虽然一种方法可能是创建一个XSLT所期望的XML模式,然后将输入XML与它进行比较,但我有100个不同版本的XSLT,所以这是不切实际的。但是,创建输入的XSD并询问XSLT是否正常是很简单。]
答案 0 :(得分:3)
这是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处理器会告诉你它。您必须使用<xsl:import-schema>
声明告诉XSLT处理器在何处查找模式。
架构意识是该语言的一个未被充分利用的特征。需要花费一些精力才能充分利用它,并且有时会出现“误报”错误消息的麻烦,但是一旦掌握了它,就可以捕获大量的简单信息。用户错误否则需要数小时才能调试。在某些情况下,模式感知还可以通过减少需要搜索的源文档的数量来帮助提高性能,并避免重复的数据类型转换 - 但更好的静态错误检查是主要的好处。