我有一个源html看起来像:
<p class="heading-8">Emergency Care<span class="char-style-override-68">, if not already done:</span></p>
<p class="List-Bullet-CHAM1-CHAM-1-List-Bullet-1 para-style-override-3"><span> </span><span class="char-style-override-25">1.</span><span> Do Initial Assessment (p. 72).</span></p>
现在我为p:
创建模板匹配<xsl:template match="x:p">
<xsl:choose>
<xsl:when test="contains(@class,'heading-8')">
<xsl:variable name="current-name" select="generate-id(.)"/>
<xsl:variable name="noTable" select="count(preceding-sibling::x:table)"/>
<p>
<b>
<xsl:apply-templates/>
</b>
</p>
<xsl:if test="following-sibling::*[1][self::x:p][contains(@class,'List-Bullet-CHAM1-CHAM-1')][generate-id(preceding-sibling::x:p[contains(@class,'heading-8 ')][1]) = $current-name]">
<ol>
<xsl:apply-templates select="following-sibling::x:p[contains(@class,'List-Bullet-CHAM1-CHAM-1')][count(preceding-sibling::x:table)=$noTable][generate-id(preceding-sibling::x:p[contains(@class,'heading-8 ')][1]) = $current-name]" mode="bullet"/>
</ol>
</xsl:if>
</xsl:when>
我现在遇到的问题是,似乎我永远无法进入那个内心的分支。但我认为源html与它完全匹配,只是不知道我哪里错了。
PS,我使用generate-id()函数来确定前一个兄弟节点的身份。
答案 0 :(得分:1)
据我所知,xsl:if语句的测试条件看起来很好,除了contains(@class,'heading-8 ')
中的尾随空格。没有包含字符串“heading-8”的 class 属性。删除xsl:if和xsl:apply-templates元素中的空格应该可以解决问题。
答案 1 :(得分:0)
我认为你可能会使 if 条件过于复杂。看起来您正在检查以下兄弟是否为 p 标记,并且具有特定的类属性。因为你已经在一个带有'heading-8'类的 p 元素上提出了建议,所以你可能不需要担心generate-id(),并且可以将它简化为以下内容:
<xsl:if
test="following-sibling::*[1][self::x:p][contains(@class,'List-Bullet-CHAM1-CHAM-1')]">