我有这个XML文件:

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="cd.xsl"?>
    <produce>
        <item>apple<x>kk</x><y>jj</y></item>
        <item>banana<x>aaa</x></item>
        <item>pepper<x>qqq</x></item>
    </produce>

这个xls文件:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                version="1.0">
  <xsl:output method="html"/>

  <xsl:template match="/">
     <html>
    <body>
    <ul>
    <li><xsl:value-of select="node()"/></li>
    </ul>
    </body>
    </html>
  </xsl:template>
  </xsl:stylesheet>

我不明白“/”和“/*”匹配之间的区别,因此我要进行各种测试,例如上面的测试,我得到:
type="text/xsl" href="cd.xsl"

我也不明白为什么(我希望produce标签)。
但是,如果使用此xls文件:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                    version="1.0">
      <xsl:output method="html"/>

      <xsl:template match="/*">
         <html>
        <body>
        <ul>
        <li><xsl:value-of select="node()"/></li>
        </ul>
        </body>
        </html>
      </xsl:template>
      </xsl:stylesheet>

我得到了空页面(只有标签的黑点)。
你能解释一下这些区别吗?

最佳答案

如果您想了解xsl转换的功能,可以使用一个工具来显示实际生成的代码(例如xsltransform.net),而不是浏览器。–迈克尔·霍尔257K
我非常同意这一点,例如使用http://xsltransform.net/
tl;dr:/是文档节点,/*是输入文档的最外层元素
从第一个样式表得到的输出是

<html>
   <body>
      <ul>
         <li>type="text/xsl" href="cd.xsl"</li>
      </ul>
   </body>
</html>

我明白为什么你会感到惊讶。让我们看一看xslt代码,其中匹配了文档节点:
<xsl:template match="/">

在此模板中,您对输入文档的唯一引用是
<xsl:value-of select="node()"/>

它选择第一个节点的值,该节点是文档节点的子节点(/)。实际上,node()是一组节点,但在xslt 1.0中,在这样的上下文中,只使用这样一组节点中的第一个项。
那么,什么是节点?在XML文档模型(如XDM)中,有许多不同类型的节点,其中包括:元素节点、属性节点、处理指令。现在看看您的输入文档:
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="cd.xsl"?>
<produce>
    <item>apple<x>kk</x><y>jj</y></item>
    <item>banana<x>aaa</x></item>
    <item>pepper<x>qqq</x></item>
</produce>

第一行是XML声明,它不是文档的一部分。第二行是一条处理指令,它告诉浏览器在哪里查找xslt样式表。处理指令是文档的一部分。
此处理指令是文档节点的第一个子节点-这就是为什么将其内容作为
<xsl:value-of select="node()"/>

因此,如果从输入文档中删除处理指令,则输出将如下所示
<html>
   <body>
      <ul>
         <li>
            applekkjj
                    bananaaaa
                    pepperqqq

         </li>
      </ul>
   </body>
</html>

因为现在,produce元素是/的第一个子节点。结果是produce元素的字符串值。
另一方面,如果模板匹配/*,则输出不是空页,而是
<html>
   <body>
      <ul>
         <li>

         </li>
      </ul>
   </body>
</html>

/*表示xml文档的最外层元素,在本例中为produce。现在,produce元素是xsl:value-of的上下文:
<xsl:value-of select="node()"/>

同样,这将选择produce元素的第一个子节点,它是一个只包含空白的文本节点。

09-05 01:27