Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/15.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
.net 模板";“继承”;_.net_Xml_Xslt_Inheritance_Xslt 1.0 - Fatal编程技术网

.net 模板";“继承”;

.net 模板";“继承”;,.net,xml,xslt,inheritance,xslt-1.0,.net,Xml,Xslt,Inheritance,Xslt 1.0,我的XSL中有两个模板,它们都应该应用于同一个节点,但其中一个比另一个更具体 e、 g.对于这个xml <root> <a/> <a attr="1" attr2="2"/> </root> 这个xsl: <xsl:template match="a"> base template </xsl:template> <xsl:template match="a[@attr]"> specifi

我的XSL中有两个模板,它们都应该应用于同一个节点,但其中一个比另一个更具体

e、 g.对于这个xml

<root>
  <a/>
  <a attr="1" attr2="2"/>
</root>

这个xsl:

<xsl:template match="a">
  base template
</xsl:template>
<xsl:template match="a[@attr]">
  specific
</xsl:template>

基础模板
具体的
通常XSL只应用其中一个模板。
但是,在我的更具体的模板中,我还想应用不太具体的模板中的所有内容。

这个答案不正确

使用

<xsl:apply-templates/>
结果如下:

base template
specific
我还没有研究如果有超过1个以上的特定模板像上面那样链接,会发生什么情况。

在XSLT中,“继承”并没有明确的含义。继承是一个面向对象的概念,适用于类和对象——在函数范式中不存在

没有
select
属性的
xsl:apply templates
不会应用与同一当前节点匹配的其他模板

相反,它指示XSLT处理程序处理剩余的输入节点,并让处理程序选择适当的模板。换句话说,这不会导致同一节点被处理两次

现在,考虑下面的样式表(基本上是您的解决方案):


基础模板
具体的
在模板匹配
a[@attr]
的上下文中,
表示:

处理当前节点的所有可用子节点(所有元素
*
,processing-instruction(),comment(),所有属性@*,text())

在输入XML中,只有一个
节点与此模板匹配。它只有属性节点,默认情况下不会输出


通常XSL只应用其中一个模板。然而,在我更具体的模板中,我还想应用不太具体的模板中的所有内容


有几种解决方案(例如,将可重用内容存储在命名模板中并调用它,导入外部样式表,使用变量,使用模板优先级,使用
xsl:choose
)。但是首先您必须揭示。

XSLT2.0具有用于此目的的功能,但在1.0中,唯一的通用选项是将不太特定的模板放在一个单独的XSLT文件中,
它,然后使用
。如果您确切地知道要使用哪个“不太具体的模板”,那么另一种方法是为该模板提供一个
名称
以及一个
匹配
,然后使用
调用该模板,但这会绕过匹配机制-您必须决定覆盖哪个模板,而不是让引擎找到该模板“次佳”。

否,
不带
选择
相同,并将模板应用于所有子节点(元素、文本节点、PI和注释)当前节点的。在本例中,它不选择任何内容-
基本模板
是匹配第一个
的模板的结果,
特定的
来自与@IanRoberts所说的
匹配的模板。此外,如果您试图通过发出
来解决这个问题,那么准备杀死您的用户处理,因为最终将进入无限递归。@harpo原则上是这样,但大多数XSLT处理器会捕捉到这一点,并发出警告:“嵌套应用模板调用过多。”“@MathiasMüller,嘿,我想.NET的处理器比大多数处理器更具原则性——特别是在射自己脚的权利方面。(实际上这是一个非常好的实现。)你能解释一下如何在这个例子中使用模板优先级吗?我想实现的正是我所说的——更具体的模板也应该应用不太具体的模板。理想情况下,在某个特定的点上,虽然在这种情况下这不是一个要求,但实际上顺序甚至不相关。@DJL无法确定模板优先级是否能解决您的问题。您没有提供足够的信息,无法给出合理、具体的答案。为了清楚起见,您可以:显示一个实际的输入和输出XMl文件(即您期望的输出与您得到的输出)和您尝试的整个XSLT样式表。这将使人们能够帮助你。@ DJL使这一点更清楚:你必须考虑的可能性,你不需要真正有两个模板匹配同一个节点,以实现你的目标。也许你走错了方向,而解决方案实际上是另一回事。不幸的是,我被1.0困住了。如果可能的话,我不希望有多个XSL(这只是一件小事)
base template
specific
<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml"/>
    <xsl:strip-space elements="*"/>

    <xsl:template match="a">
        base template
    </xsl:template>

    <xsl:template match="a[@attr]">
        <xsl:apply-templates/>
        specific
    </xsl:template>

</xsl:stylesheet>