【发布时间】:2020-02-04 14:48:03
【问题描述】:
我有一个条件列表,我想检查一个元素的直接兄弟是否匹配任何这些条件。
如果这些条件是简单的标签名称,这很容易。
<xsl:param name="tag-list" select="tokenize('img figure table', '\s+')"/>
<xsl:template match="* | text()">
<xsl:variable name="next-name" select="name(following-sibling::*[1])" />
<xsl:if test="$next-name = $tag-list">
<!-- DoSomething -->
</xsl:if>
</xsl:template>
此模板将匹配任何元素或文本节点,如果该节点的紧随其后的兄弟节点是 <img>, <figure> or <table>,则将执行 DoSomething。
但是,我想检查更复杂的条件。当模板与具有特定属性、子项或文本值的同级元素匹配时,我如何才能只做 DoSomething?我更喜欢使用单个 <xsl:if> 来执行此操作,因为此同级条件列表可能会很长。
<xsl:param name="tag-list" select="tokenize('img[@src] figure[text()] table[tbody]', '\s+')"/>
<xsl:template match="* | text()">
<xsl:if test="???">
<!-- DoSomething -->
</xsl:if>
</xsl:template>
【问题讨论】:
-
不应该简单地将条件放在匹配模式的谓词中吗?任何,因为您使用了 XSLT 3 标记,所以可能有一种使用静态参数和影子属性的方法。你知道它们是如何工作的吗? stackoverflow.com/a/39368038/252228 有一个例子。