关于xslt中的根节点

问题描述 投票:1回答:2

我是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中没有显示输出。我不明白为什么?

<xsl:template match="/">

当它指向Hello节点的根节点时。因此在情况1执行时

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

这将打印整个xml。

在案例2中:何时执行

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

它应该打印在下面。

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

有人可以帮忙吗?

谢谢,shashiraj

xml xslt
2个回答
2
投票

您需要了解术语的变化。在我所知道的所有树模型中,有两个相关节点:一个表示元素Hello(我称之为“最外层元素”,希望避免混淆),加上它的父节点,它代表整个文档:让我们调用那个“容器”当下。

XML规范本身没有定义树模型,但它确实说“只有一个元素,称为根或文档元素” - 这是混淆的大部分原因。

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

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

在XPath 2.0(和XSLT 2.0)中,您可以构造树,其中树的根可以是任何类型的节点,例如,您可以拥有没有父节点的元素。因此术语发生了变化:“root”现在是一个没有父节点的节点(任何类型),而我所谓的“容器”代表整个文档现在被称为“文档节点”。

但无论您使用的是XPath 1.0还是2.0,/*都匹配Hello元素,而/匹配其父节点,后者是树的根。


1
投票

/选择根节点,该节点是包含所有其他节点的文档节点。根元素由/*选择。

© www.soinside.com 2019 - 2024. All rights reserved.