XSLT:当多个子XSLT导入时,删除标记不起作用



我有一个包含多个xslt的父xslt。我需要从XML中删除特定的标记及其内容,并且标记可以在任何地方使用。

需要删除标记x的XML示例:

<root>
<x>
content
</x>
<a>
<x>
content
</x>
retain
</a>
<b>
inside B
<c>
<x>
content 
</x>
</c>
</b>
</root>

解决这个问题最简单的方法是使用一个空的标识模板:

<xsl:template match="//x"/>

但是,只有当这是唯一一个在XML文件上工作的xslt时,这才有效。当我将其他XSLT包含到父XSLT中时,该模板匹配仅在第一级起作用。我想知道为什么会这样?

另外,当我们不知道它在使用XSLT的XML中嵌套得有多深时,是否有任何方法可以遍历所有子节点?

提前感谢!

很可能是

(a)因为存在另一个模板规则匹配具有相同或更高优先级的相同元素,或者

(b),因为其他样式表模块中的模板规则从不执行选择x元素进行处理的xsl:apply-templates。(也许他们会在x元素的祖先上执行xsl:copy-of操作。)

你也问:

另外,当我们不知道它在使用XSLT的XML中嵌套得有多深时,是否有任何方法可以遍历所有子节点?

我怀疑当你说"孩子们";你是说"后代"吗?(正确使用术语是理解XPath和XSLT相关信息的关键)。

XSLT的正常设计模式是递归地处理树,通过在每个级别使用xsl:apply-templates来处理当前节点的子节点,这正好达到了您想要的效果。

最新更新