如何使用XSLT和Saxon有条件地指定XML模式类型

时间:2013-12-19 09:59:57

标签: xml xslt xpath xquery saxon

我使用这个merge.xslt脚本将几个不同的XML文件合并为一个。此工具非常有用,包含dontmerge命令行参数,因此某些XML元素不会合并。问题是只能指定一个XML元素,我需要能够指定多个不应合并的XML元素。我可以在脚本中添加更多命令行参数,例如dontmerge2dontmerge3等,但这不是一个优雅的解决方案。

在研究应该 not 的特定XML元素时,我意识到它们都是相同的XML模式类型,如下所示:

<xs:element name="doCliCommand" type="cliParametersT">
</xs:element>
<xs:element name="undoCliCommand" type="cliParametersT">
</xs:element>

因此,我希望能够执行dontmerge

之类的操作,而不是doCliCommandundoCliCommand使用dontmergetype=cliParametersT

merge.xslt的相关部分如下:

  <xslt:param name="dontmerge" />
  ...
  <xslt:when test="$type1='element' and $type2='element' and
                   local-name($node1)=local-name($node2) and
                   namespace-uri($node1)=namespace-uri($node2) and
                   name($node1)!=$dontmerge and name($node2)!=$dontmerge">

所以这就是问题:如何修改这个特定的xslt测试条件以便能够测试XML模式类型?我没有找到任何适当的XPath,XQuery或XSLT函数来获取模式类型。

有一些相关的question,他们提到除非使用Saxon扩展,否则不能这样做。我正在使用SaxonHE9-5-1-3J。

1 个答案:

答案 0 :(得分:1)

使用Saxon-EE等架构感知的XSLT 2.0处理器,您可以编写

<xsl:when test=". instance of element(*, cliParametersT)">

您需要确保使用xsl:import-schema将架构导入到样式表中,并且需要确保源文档实际上是针对架构进行验证的(使用Saxon,使用-val:strict on the命令行)。