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

时间:2014-04-08 08:16:49

标签: 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>

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>

然后我在Internet Explorer中打开input.xml,然后按下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>

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

1 个答案:

答案 0 :(得分:7)

//*[1]/descendant-or-self::node()/*[1](//*)[1](/descendant-or-self::node()/*)[1]所以前者选择所有元素节点作为其父节点的第一个子节点,而后者仅选择第一个节点由括号中的表达式选择,即它仅选择那些父节点的子节点中的第一个元素节点。