2015-11-29 37 views
1

我是xslt的新手。关于xslt中的根节点

请参见下面的情况:

输入:

<?xml version="1.0"?> 
     <Hello> 
      <hi> 
      <hii> 
      shashi 
      </hii> 
      </hi> 
     </Hello> 

案例1:

XSLT代码:

<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

    <xsl:template match="/"> 
    <xsl:copy-of select="."/> 
    </xsl:template> 

</xsl:stylesheet> 

输出为案例1:

<?xml version="1.0"?> 
<Hello> 
<hi> 
<hii> 
shashi 
</hii> 
</hi> 
</Hello> 

案例2:

XSLT代码:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

<xsl:template match="/"> 
<xsl:copy-of select="./hi"/> 
</xsl:template> 
</xsl:stylesheet> 

在案例2中没有输出shown.I我没有得到,为什么?

<xsl:template match="/"> 

时,当它执行

<xsl:copy-of select="."/> 

这指向即Hello.Therefore根节点的情况下,1这将打印整个XML。

在情况2: 当它执行

<xsl:copy-of select="./hi"/> 

它应该低于打印。

<hi> 
    <hii> 
    shashi 
    </hii> 
    </hi> 

有人可以帮忙吗?

谢谢, Shashiraj NK

+0

如果您选择=“./ Hello”或选择=“./ Hello/hi”,情况2的输出会是什么? – mikey

+0

另请参阅:http://stackoverflow.com/questions/30919896/what-match-actually-returns/30920447#30920447 –

回答

1

/选择其为含有所有其它节点的文档节点的根节点。根元素由/*选择。

+0

''是根节点的子节点。 – keshlam

2

您需要注意术语的变化。在我所知道的所有树模型中,有两个相关的节点:一个代表元素Hello(我称之为“最外层元素”,希望避免混淆)以及代表文档整体的父代:那一刻的“容器”。

XML规范本身没有定义树模型,但它确实会说“确切地说有一个元素,称为根或文档元素” - 这是造成许多混淆的根源。

DOM将容器调用为Document节点(或者,只是为了增加复杂性,在DocumentFragment不是具有单个最外层元素的格式良好的文档的情况下)。它将最外层的元素称为“文档元素” - 它至少具有与XML规范中的术语相匹配的优点。

在XPath 1.0(因此XSLT 1.0)中,该容器被称为“根节点”,该规范使用术语“文档元素”作为最外层的元素,尽管它没有起到非常重要的作用,主要是因为该模型支持具有多个子元素的文档节点。

在XPath 2.0(和XSLT 2.0)中,您可以构建树的根,树的根可以是任何类型的节点,例如,您可以拥有一个没有父节点的元素。所以术语有一个变化:“根”现在是一个没有父节点的节点(任何类型的节点),而我称之为“容器”的文档作为一个整体称为“文档节点”。

但是,无论您是使用XPath 1.0还是2.0,/*都与Hello元素相匹配,并且/与它的父节点(它是树的根节点)匹配。