答案 0 :(得分:1)
match="@*|node()[not(self::*)]"
@*
- 模板匹配所有属性节点
node()[XXX]
- 模板匹配元素,文本节点,注释和处理指令,前提是谓词XXX为真
self::*
- 如果上下文节点是一个元素,则选择该元素,否则它不会选择任何内容
not(self::*)
- 如果self::*
没有选择任何内容,即上下文节点不是元素,则为真。
因此代码匹配所有属性,文本节点,注释和处理指令
也可以写成
match="@* | text() | comment() | processing-instruction()"
下一行
<xsl:element name="{local-name()}"/>
创建一个元素,其名称与上下文项的本地名称相同。如果上下文项是属性或处理指令,则这很好,但如果上下文项是注释或文本节点,则会导致动态错误,因为这些节点没有本地名称。
所以代码是错误的:编写一个匹配注释和文本节点的模板规则没有意义,如果遇到一个则会失败。
答案 1 :(得分:0)
您正在创建包含所有node()名称和属性而不是剩余元素的元素:
注意:您不匹配elemetns