繁体   English   中英

XSL和XPATH问题匹配

[英]XSL and XPATH issue match

我有这个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>

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

如果您想了解XSL转换的功能,请使用可以显示实际结果代码的工具(例如xsltransform.net)-而不是浏览器。 – michael.hor257k

我对此非常同意,例如使用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元素的第一个子节点-这是仅包含空格的文本节点

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM