为什么//*[1]与(//*)[1]不同

Yan*_* Bo 0 xml xslt xpath xquery

我创建了两个文件,input.xmlformatter.xslt.

input.xml中:

<?xml-stylesheet type="text/xsl" href="formatter.xslt"?>
<div><span>1</span><span>2</span></div>
Run Code Online (Sandbox Code Playgroud)

formatter.xslt:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="/">
        <html><head></head><body>
            <xsl:copy-of select="//*[1]"/>
            ,
            <xsl:copy-of select="(//*)[1]"/>
        </body></html>
    </xsl:template>
</xsl:stylesheet>
Run Code Online (Sandbox Code Playgroud)

然后我input.xml在Internet Explorer中打开,然后按下F12.我看到DOM树是这样的:

<html><head></head><body>
    <div><span>1</span><span>2</span></div><span>1</span>
    ,
    <div><span>1</span><span>2</span></div>
</body></html>
Run Code Online (Sandbox Code Playgroud)

为什么//*[1](//*)[1]复制不同的元素到输出文件?

Mar*_*nen 7

以及//*[1]/descendant-or-self::node()/*[1]同时(//*)[1](/descendant-or-self::node()/*)[1]如此前者选择是它们的父的第一个子所有元素节点,而后者仅选择由括号中的表达式中选择的第一个节点,即它仅选择第一属于的子那些元素节点父节点.