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
Xml XSL 2.0关联两个模板的结果_Xml_Xslt_Xslt 2.0 - Fatal编程技术网

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之前
用这种方式处理内容?我想这是最好的办法

谢谢你抽出时间

编辑:

下面是一些模式细节。如果前面有段落,我想处理表格和前面的段落。如果前面没有p,我还需要处理表。如果没有下表,我还需要处理p。根据线索和错误,这似乎是可行的,但我想知道我是否应该像在match=“p”中那样在match=“table”中进行筛选(或者因为我在同一类型上有两个类似的匹配,所以某种程度上为我解决了这一问题

<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”来实现这一点