繁体   English   中英

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

[英]How can I validate an XSLT template's logic against an XML schema?

XSLT转换对要转换的XML结构进行隐式假设。 例如,以下内容:

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

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

<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是否可以这样做很简单。

这就是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处理器在哪里可以找到模式。

模式意识是该语言的一个未被充分利用的功能。 要利用它,需要先付出一些努力,并且有时可能会因“假阳性”错误消息而有些麻烦,但是一旦掌握了这些错误,它就可以抓住很多简单的方法用户错误,否则将需要数小时来调试。 在某些情况下,模式感知还可以通过减少需要搜索的源文档的数量以及避免重复的数据类型转换来帮助提高性能,但是更好的静态错误检查是主要的好处。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM