如何针对XML模式验证XSLT模板的逻辑?

时间:2017-10-24 13:01:31

标签: xml xslt xsd

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是否正常是很简单。]

1 个答案:

答案 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处理器在何处查找模式。

架构意识是该语言的一个未被充分利用的特征。需要花费一些精力才能充分利用它,并且有时会出现“误报”错误消息的麻烦,但是一旦掌握了它,就可以捕获大量的简单信息。用户错误否则需要数小时才能调试。在某些情况下,模式感知还可以通过减少需要搜索的源文档的数量来帮助提高性能,并避免重复的数据类型转换 - 但更好的静态错误检查是主要的好处。