child::node() 和 child::* 之间的区别
我刚刚写了一个 XSLT,一开始不起作用。
我必须将
的所有子项重命名为
:
<?xml version="1.0" encoding="utf-8"?>
<Record>
<Recordset>
<company>102</company>
<store>1801</store>
....
</Recordset>
<Recordset>
....
</Recordset>
</Record>
我使用了以下 XSLT:
<xsl:template match="Record/Recordset/child::*">
<xsl:element name="C">
<xsl:apply-templates select="@*|node()"/>
</xsl:element>
</xsl:template>
它可以工作并重命名
到
。 但首先我在模板中的匹配看起来像这样:
<xsl:template match="Record/Recordset/child::node()">
我的想法是
的每个子节点都是一个节点,因此 node()
是合适的。 它也有效,但它为每个孩子插入了一个额外的
。
child::node()
和 child::*
之间有什么区别?
I just wrote an XSLT that did not work at first.
I had to rename all children of <Recordset>
to <C>
:
<?xml version="1.0" encoding="utf-8"?>
<Record>
<Recordset>
<company>102</company>
<store>1801</store>
....
</Recordset>
<Recordset>
....
</Recordset>
</Record>
I used the following XSLT:
<xsl:template match="Record/Recordset/child::*">
<xsl:element name="C">
<xsl:apply-templates select="@*|node()"/>
</xsl:element>
</xsl:template>
It works and renames all children of <Recordset>
to <C>
.
But first my match in the template looked like this:
<xsl:template match="Record/Recordset/child::node()">
My idea was that every child of <Recordset>
is a node, thus node()
would be appropriate.
It worked too but it inserted an extra <C/>
for each child.
What's the difference between child::node()
and child::*
?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
child::node()
匹配除属性节点、命名空间节点或文档节点之外的任何节点。这意味着它确实匹配处理指令、注释和文本节点。child::*
仅匹配 元素。请参阅规范的第 5.5.3 节:
更新:迈克尔的回答启发了以下样式表。使用它来测试处理节点的类型:
修改匹配/选择的内容以测试其他模式。例如,以下输入:
产生以下输出:
特别感谢此页面让我开始进行节点类型测试。 (迈克尔六年多前的答案之一也出现在那里,这是特别合适的。)
child::node()
matches any node that's not an attribute node, namespace node, or document node. That means that it does match processing instructions, comments, and text nodes.child::*
matches only elements.See section 5.5.3 of the spec:
Update: Michael's answer inspired the following stylesheet. Use it to test the types of nodes as they're processed:
Modify what's matched/selected to test other patterns. For example, the following input:
Produces the following output:
Special thanks to this page for getting me started on the node-type tests. (It's especially fitting that one of Michael's answers from over six years ago appears there, too.)
为了扩展 lwburk 的答案,如果您的 XML 如下所示:
那么 A 元素有 7 个子节点;其中三个是元素,四个是文本节点。表达式
child::node()
匹配所有 7 个元素,而child::*
仅匹配元素。To expand on lwburk's answer, if your XML looks like this:
Then the A element has 7 child nodes; three of them are elements, four are text nodes. The expression
child::node()
matches all 7, whereaschild::*
only matches the elements.