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