Xml XSL 2.0关联两个模板的结果
假设我有两个模板:Xml XSL 2.0关联两个模板的结果,xml,xslt,xslt-2.0,Xml,Xslt,Xslt 2.0,假设我有两个模板: <xsl:template match="h1" mode="SomeMode"> <holder><xsl:value-of select="something"/></holder> </xsl> <xsl:template match="h2" mode="SomeMode"> <holder><xsl:value-of se
<xsl:template match="h1" mode="SomeMode">
<holder><xsl:value-of select="something"/></holder>
</xsl>
<xsl:template match="h2" mode="SomeMode">
<holder><xsl:value-of select="something"/></holder>
</xsl>
如果h1是h2的前一个同级,我希望同一个持有者包含select结果的任何值。我已经有了h1和h2模板,它们相当复杂,但它们“无法”关联同级元素
但是,我不想要求有一个h1和一个h2,但是如果有两个,并且h1在h2之前,那么使用相同的保持器。我可能需要稍微复杂一些的规则,比如在h2之前有两个H1,等等
我的猜测是,如何创建一个新模板来强制执行“h1在h2之前”规则,并从中“调用”其他模板。我所看到的问题是h1本身和h2本身也会匹配,这是我不想要的,另外我需要弄清楚如何清理holder标签。。丑陋的
我的第二个猜测是在h2中查找前面的兄弟h1,然后这样做,但是h1会自动匹配
我是否需要为h1和h2的每个可能关系(兄弟姐妹关系)提供模板
- H1没有兄弟姐妹
- 没有兄弟姐妹的H2
- H2之前的H1
- H1在H1之前,H2之前
<xsl:template match="table[preceding-sibling::p]" mode="aaa">
</xsl:template>
<xsl:template match="table" mode="aaa">
</xsl:template>
<xsl:template match="p" mode="aaa">
<xsl:variable name="sibling_table" select="following-sibling::table" />
<xsl:if test="not($sibling_table)" >
</xsl:if>
</xsl:template>
这似乎有效,但我还不能确定。这似乎很尴尬,但如果这是一种可接受的方式….?您似乎在思考规范,而不是清楚地告诉我们规则是什么。多模板规则当然是解决这一问题的一种方法。另一种方法可能是使用分组,但如果没有更多细节,很难判断。为了搜索者的利益 事后看来,我最终发现实现这一目标的方法似乎很简单,但由于某些原因,很难弄清楚 在所处的任何模板中,使用“应用模板”(和模式)并选择要关联的类型:
<xsl:apply-templates select="p[node()] | list[node()] | table[node()]" mode="SomeMode" />
然后为每种类型创建一个模板,并对其中的每种类型执行任何自定义处理:
<xsl:template match="p" mode="SomeMode">
</template>
<xsl:template match="list" mode="SomeMode">
</template>
<xsl:template match="table" mode="SomeMode">
</template>
然后,这种方法足够灵活,可以应用其他逻辑,例如要求p具有某种类型的前一个同级,因为您可以在与p匹配的模板中添加“xsl:if”来实现这一点