首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 ><apply-templates/> vs <apply-select=“.”XSLT中的/>

<apply-templates/> vs <apply-select=“.”XSLT中的/>
EN

Stack Overflow用户
提问于 2017-01-25 15:29:58
回答 1查看 4.5K关注 0票数 1

看看地址应用下面的XSLT代码.下面您可以找到这段代码的第一部分(对于我的问题来说也是决定性的):

代码语言:javascript
运行
复制
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="/">
<html>
<body>
<h2>My CD Collection</h2>  
<xsl:apply-templates/>  
</body>
</html>
</xsl:template>

如果您现在只更改行

代码语言:javascript
运行
复制
<xsl:apply-templates/> 

代码语言:javascript
运行
复制
<xsl:apply-templates select="cd"/>

转变不再有效了..。(代码现在看起来如下:)

代码语言:javascript
运行
复制
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="/">
<html>
<body>
<h2>My CD Collection</h2>  
<xsl:apply-templates select="cd"/>  <!--ONLY LINE OF CODE THAT WAS CHANGED-->
</body>
</html>
</xsl:template>

我的问题是:为什么更改会破坏代码?在我看来,这两种情况的逻辑是相同的:

  1. 应用与"cd“匹配的模板
  2. 内部模板"cd“应用另外两个模板(”标题“+”艺术家“)

更新:

整个xslt代码如下:

代码语言:javascript
运行
复制
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="/">
  <html>
  <body>
  <h2>My CD Collection</h2>  
  <xsl:apply-templates/>  
  </body>
  </html>
</xsl:template>

<xsl:template match="cd">
  <p>
    <xsl:apply-templates select="title"/>  
    <xsl:apply-templates select="artist"/>
  </p>
</xsl:template>

<xsl:template match="title">
  Title: <span style="color:#ff0000">
  <xsl:value-of select="."/></span>
  <br />
</xsl:template>

<xsl:template match="artist">
  Artist: <span style="color:#00ff00">
  <xsl:value-of select="."/></span>
  <br />
</xsl:template>

</xsl:stylesheet>

以下是xml的摘录:

代码语言:javascript
运行
复制
<?xml version="1.0" encoding="UTF-8"?>
<catalog>
  <cd>
    <title>Empire Burlesque</title>
    <artist>Bob Dylan</artist>
    <country>USA</country>
    <company>Columbia</company>
    <price>10.90</price>
    <year>1985</year>
 </cd>
 <cd>
    <title>Hide your heart</title>
    <artist>Bonnie Tyler</artist>
    <country>UK</country>
    <company>CBS Records</company>
    <price>9.90</price>
    <year>1988</year>
 </cd>
    ......
 </catalog>
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-01-25 15:47:14

W3C学校没有告诉您的是XSLT的内置模板规则

执行<xsl:apply-templates select="cd"/>时,您将定位在文档节点上,该节点是catalog元素的父节点。执行select="cd"将不会选择任何内容,因为cdcatalog元素的子元素,而不是文档节点本身的子元素。只有catalog是个孩子。

(请注意,catalog是XML的“根元素”。XML文档只能有一个根元素)。

但是,当您执行<xsl:apply-templates />时,这与选择catalog元素的<xsl:apply-templates select="node()" />等效。这就是内置模板开始的地方。在XSLT中没有匹配catalog的模板,因此使用内置的模板。

代码语言:javascript
运行
复制
<xsl:template match="*|/">
   <xsl:apply-templates/>
</xsl:template>

(在这里,*匹配任何元素)。因此,这个内置模板将选择catalog的子节点,从而匹配XSLT中的其他模板。

注意,在第二个示例中,您可以将模板匹配更改为.

代码语言:javascript
运行
复制
<xsl:template match="/*">

这将匹配catalog元素,因此<xsl:apply-templates select="cd" />将工作。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41855428

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档