Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xslt XPath递归下降在匹配和选择之间的行为不同_Xslt - Fatal编程技术网

Xslt XPath递归下降在匹配和选择之间的行为不同

Xslt XPath递归下降在匹配和选择之间的行为不同,xslt,Xslt,信息 为什么递归下降算子在两种情况下有不同的行为 ● 模板的“匹配”属性,其中该属性将被忽略,并且仅选择子项,而忽略其子项 ● 对于每个属性,选择其正常工作的属性 给出了test.xsl的两个示例,它们都在下面的test.xml上运行 test.xml select=//个人 在这个例子中,我们使用select=//person来选择所有的person 文档中的元素。这将正确选择所有根目录 包括id=21的子代人员元素。价值 match=class不相关,因为select=//perso

信息

为什么递归下降算子在两种情况下有不同的行为

● 模板的“匹配”属性,其中该属性将被忽略,并且仅选择子项,而忽略其子项

● 对于每个属性,选择其正常工作的属性

给出了test.xsl的两个示例,它们都在下面的test.xml上运行

test.xml

select=//个人

在这个例子中,我们使用select=//person来选择所有的person 文档中的元素。这将正确选择所有根目录 包括id=21的子代人员元素。价值 match=class不相关,因为select=//person使用绝对值 路径

test.xsl

那么,模板本身具有匹配项不会导致任何处理,并且您的模板具有匹配项

  <xsl:template match="//person">
    <xsl:value-of select="@id"/>
  </xsl:template>
或者您将需要一个模板,如

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


匹配模式和选择表达式之间存在差异。匹配模式不选择任何内容-它仅用于查看当前节点是否匹配该模式。因此,匹配模式match=//person与match=person相同


如果一个节点从未成为当前节点,即模板未应用于该节点,那么它是否匹配任何模板的匹配模式并不重要。这在您的第一个示例中显示:在遇到节点之前,将递归地应用;这与更特定模板的模式相匹配-但该模板没有将模板应用于其任何子体的说明,因此链在这一点上断开,并且永远不会检查节点是否有与之匹配的模板。

这听起来非常混乱,因为匹配和选择之间的差异非常细微。您是说模板引擎有自己的默认内置逻辑,用于迭代我不影响的元素。在迭代过程中,检查每个元素是否与某个模板匹配,如果匹配,则在不进入模板的情况下将其取出。因此,match属性不定义如何选择元素。for-each的行为类似于选择,并且匹配内置在同一个属性中。换句话说,for-each没有一个用于选择元素的属性和一个用于匹配元素的属性,而模板有不同的属性用于选择隐藏元素和匹配暴露元素。1。我不认为两者之间有细微的区别2.XSLT确实有一个默认行为,请参见我的答案中的链接,您的模板可以覆盖该链接。应用于元素的默认模板包括指令;你的模板没有。这就是打破递归的原因。模板引擎有两个参数,一个用于选择,一个用于匹配元素。而for-each只有一个用于选择和匹配的参数。我假设,对于每个元素,也可以有两个参数——一个定义如何遍历元素,另一个用于匹配元素。然后我们将在框架的不同部分如何工作方面保持一致性,这将使它更容易理解和使用。是什么原因使这两件事情如此根本不同?在表面上,它们做同样的事情-选择元素。但从表面上看,他们是以一种完全不同的方式做这件事的,以至于很难在头脑中同时对同一个问题保持如此不同的看法。如果没有解释原因,情况会变得更糟。教程通常会解释事物是如何工作的,但他们不会费心解释它们为什么以这种方式工作。这些不是“递归下降运算符”。递归下降是一种解析技术,而不是运算符类,XPath或XSLT实现可能使用它,也可能不使用它。我的印象是“/”被称为递归下降。如果不是,怎么称呼?
(1)(2)
<?xml version="1.0" ?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

  <xsl:template match="text()"/>  

  <xsl:template match="class">
    <xsl:for-each select="//person">  
      <xsl:value-of select="@id"/>
    </xsl:for-each>  
  </xsl:template>

</xsl:stylesheet>
(1)(2)(21)
  <xsl:template match="//person">
    <xsl:value-of select="@id"/>
  </xsl:template>
  <xsl:template match="//person">
    <xsl:value-of select="@id"/>
    <xsl:apply-templates/>
  </xsl:template>
<xsl:template match="/">
  <xsl:apply-templates select="//person"/>
</xsl:template>
<xsl:template match="/">
  <xsl:apply-templates select="//person"/>
</xsl:template>
  <xsl:template match="person">
    <xsl:value-of select="@id"/>
  </xsl:template>