当前位置: 首页 > 知识库问答 >
问题:

xsl:call-template和xsl:apply-templates的行为不同吗?

龚迪
2023-03-14

为什么XSL:Template在内联运行时的“List all Attributes”行为与作为命名模板调用时的行为不同?

我有以下XML:

<?xml version="1.0" encoding="UTF-8"?>
<cars>
  <car model="Focus" manufacturer="Ford" year="2000" />
  <car model="Golf" manufacturer="Volkswagen" year="1999" />
  <car model="Camry" manufacturer="Toyota" year="1999" />
  <car model="Civic" manufacturer="Honda" year="2000" />
  <car model="Prizm" manufacturer="Chevrolet" year="2000" />
</cars>
<?xml version="1.0" encoding="UTF-8"?>

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

  <xsl:template match="/cars">
    <xsl:apply-templates />
  </xsl:template>

<!-- When applied inline this structure iterates through all @model attributes. -->
  <xsl:template match="car">
    <xsl:value-of select="@model"/>
  </xsl:template>

</xsl:stylesheet>
Focus
Golf
Camry
Civic
Prizm
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

  <xsl:template match="/cars">
    <xsl:apply-templates />
  </xsl:template>

  <xsl:template match="car">
    <xsl:call-template name="models"/>
  </xsl:template>

<!-- When applied via call-template, lists one @model attribute, then returns -->
  <xsl:template name="models">
    <xsl:value-of select="@model"/>
  </xsl:template>

</xsl:stylesheet>

请注意,我知道有显式的XSL循环构造。我已经用mode=templates生成了我想要的多属性列表。这些不是我要找的答案。我的问题是,为什么本质上相同的xsl:template结构的内联行为与被叫行为不同,这取决于它是内联运行还是调用。THX...

共有1个答案

赵飞雨
2023-03-14

如果我将以下XSL应用于该XML(在XSL调试器中,这样我就可以看到发生了什么),那么内联模板match=“car”将遍历所有@model属性。

不,不完全是。这就是你对正在发生的事情的内部模型需要调整的地方。

在第一个XSLT转换中,匹配car的模板不遍历任何内容。它反复匹配。它能够匹配是因为 出现在/cars模板中,并为cars的每个子节点(包括car元素)调用模式匹配,因为

<xsl:apply-templates/> 

真的和

<xsl:apply-templates select="node()"/>
 类似资料:
  • 问题内容: 考虑以下代码: 然后考虑一下: 为什么这两个有区别? (是的,我尝试搜索此内容)。 问题答案: 更改列表,然后返回一个 新 列表,如所示。 第一次尝试调用的表达式,如果失败,将在赋值之后调用(请参见Sven的评论进行较小的更正)。从那时起,它就完成了这一点’o突变魔术。

  • 我在下面添加可运行的代码段。第一个是React.PureComponent版本 为什么第二个成功运行,但第一个没有??我试图寻找原因,但没有找到任何好的理由

  • 问题内容: 我发现同一mod操作会根据所使用的语言产生不同的结果。 在Python中: 产生 9 在C中产生 -1 ! 哪一个是正确的模? 如何使C中的mod操作与Python中的一样? 问题答案: 两种变体都是正确的,但是在数学(尤其是数论)中,Python的模数是最常用的。 在C中,您确实获得了与Python中相同的结果。例如 。请注意,它仍然对正整数:和C实现的两个变体(正或负余数)仍然起作

  • 考虑到这个辅助函数: 它应该将基本类型(和字符串)转换为字符串表达式,当我像这样使用它时,MSVC会出现编译错误: 有了clang,编译起来没有任何问题,但有了MSVC,我明白了: 2. 2. 2. 2. 2. 2. 2. 2. 2. 2. 2. 2. 2. 2. 2. 显然,编译器会考虑

  • 其中一个测试通过,另一个给出以下错误: java.lang.ClassCastException:类org.springframework.http.ResponseEntity不能强制转换为类org.junit.jupiter.api.function.executable(org.springframework.http.ResponseEntity和org.junit.jupiter.api

  • 我目前正在做一个更大的项目,我想用很少的代码作为输入来测试可执行文件。 我这样称呼它

  • 问题内容: 嗨,大家好,我只是python的新秀(即使在编程方面也是如此),所以我的问题听起来很基本,但我很难理解这一点。 为什么对“浮动对象”进行算术选择行为? 图像链接是我在本地jupyter笔记本中的运行结果: jupyter笔记本运行结果 赞赏有用的见解!谢谢 编辑050418 09:53-添加一个我认为是类似问题的链接 Numpy AttributeError:’float’对象没有属性