我有一个包含多个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
来处理当前节点的子节点,这正好达到了您想要的效果。