假设我有这两个模板:
<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的前一个兄弟,我希望同一个持有者包含任何选择结果的值。我已经拥有了h1和h2模板并且它们相当复杂,但它们“未能”关联兄弟元素。
但是,我不想要求有h1和h2,但是如果有两个并且h1在h2之前,则使用相同的持有者。我可能需要稍微复杂的规则,比如在h2之前的两个h1等等。
我猜这将如何创建一个新模板,强制执行'h1之前的h2'规则并'调用'其他模板。我想到的问题是h1本身和h2本身也会匹配,我不想要,而且我需要弄清楚如何清理持有者标签......丑陋。
我的第二个猜测是在h2中寻找前兄弟h1并以这种方式进行,但h1本身也会匹配。
对于h1和h2,我是否需要针对每种可能关系(兄弟姐妹)的模板?
以这种方式处理内容?我想这看起来是最好的方式。
感谢您的时间。
编辑:
以下是一些模式细节。如果有前一段,我想处理表和前面的段落。如果没有前面的p,我还需要处理表。如果没有下表,我还需要处理p。通过跟踪和错误,这似乎工作,但我想知道我是否应该在match =“table”中过滤,就像我在match =“p”中那样(或者以某种方式照顾我,因为我有两个类似的匹配相同的类型?
<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>
这似乎有效,但我还不确定。这看起来很尴尬,但如果这是一种可以接受的方式......?
答案 0 :(得分:0)
您似乎在思考规范,而不是清楚地告诉我们规则是什么。多个模板规则肯定是解决它的一种方法。另一个可能是使用分组,但没有更多细节很难分辨。
答案 1 :(得分:0)
为了搜索者的利益......
我最终发现实现这一目标的方式在后见之明似乎很简单,但由于某种原因很难弄明白。
在你所使用的任何模板中,使用apply-templates(和一个模式)和一个选择,将你想要关联的类型组合在一起:
<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”来强制执行该操作。现在似乎很简单。