我使用这个merge.xslt脚本将几个不同的XML文件合并为一个。此工具非常有用,包含dontmerge
命令行参数,因此某些XML元素不会合并。问题是只能指定一个XML元素,我需要能够指定多个不应合并的XML元素。我可以在脚本中添加更多命令行参数,例如dontmerge2
,dontmerge3
等,但这不是一个优雅的解决方案。
在研究应该 not 的特定XML元素时,我意识到它们都是相同的XML模式类型,如下所示:
<xs:element name="doCliCommand" type="cliParametersT">
</xs:element>
<xs:element name="undoCliCommand" type="cliParametersT">
</xs:element>
因此,我希望能够执行dontmerge
doCliCommand
和undoCliCommand
使用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。
答案 0 :(得分:1)
使用Saxon-EE等架构感知的XSLT 2.0处理器,您可以编写
<xsl:when test=". instance of element(*, cliParametersT)">
您需要确保使用xsl:import-schema
将架构导入到样式表中,并且需要确保源文档实际上是针对架构进行验证的(使用Saxon,使用-val:strict on the命令行)。