我在查找节点或包含文本方面遇到了一些困难。
考虑以下xml:
的例子<?xml version="1.0" encoding="utf-8"?>
<doc xml:lang="it">
<articolo>
<titolazione id="U20690661166yt" contentType="headline">
<occhiello class="occhiello">
<p>
<span class="parolachiave">L’ALTRO COLPO PER L’ATTACCO</span>
</p>
</occhiello>
<titolo class="titolo">
<p>Il gran giorno</p>
<p>di Llorente:</p>
<p>arriva a Torino </p>
<p>e fa le visite</p>
</titolo>
<sommario class="catenaccio">
<?EM-dummyText [sommario]?>
</sommario>
</titolazione>
</articolo>
正如你所看到的,我在“Titolazione”下有3个节点:occhiello,titolo和sommario。我需要创建一个tempate,能够理解这3个节点内是否有文本(在任何级别),并根据这个添加类“无文本”,所以我可以用不同的方式设置它。
以下是为occhiello制作的一个例子:
<xsl:template name="occhiello">
<xsl:if test="/doc/articolo/titolazione/occhiello">
<xsl:choose>
<xsl:when test="string-length(normalize-space(/doc/articolo/titolazione/occhiello/*/text())) = 0">
<h6 class="overhead no-text">
<xsl:apply-templates select="/doc/articolo/titolazione/occhiello/*" />
</h6>
</xsl:when>
<xsl:otherwise>
<h6 class="overhead">
<xsl:apply-templates select="/doc/articolo/titolazione/occhiello/*" />
</h6>
</xsl:otherwise>
</xsl:choose>
</xsl:if>
</xsl:template>
“titolo”和“sommario”的模板是相同的,只是xpath正在改变。 现在我注意到这个模板接近我需要但仍然有些错误。如果你看一下这个例子是认识到“titolo”有文字,就会认识到“sommario”没有文字,但出于某种原因却出现了“titolazione”的错误。即使有文本,它也会添加“无文本”类。我想也许原因可能不包含在
标签中,而是包含在嵌套标签中(我可能有更多的嵌套级别)。
知道如何纠正它吗?
全部谢谢。
答案 0 :(得分:2)
以下内容如何:
<xsl:template match="occhiello | titolo | sommario">
<h6 class="overhead {substring('no-text', 1, 7 * not(normalize-space()))}">
<xsl:apply-templates select="*" />
</h6>
</xsl:template>
答案 1 :(得分:1)
在任何后续级别检查文本的一种有用方法是使用value-of
,因为如果在包含子节点的节点上运行,则会返回这些节点文本的串联。 / p>
XML
<foo>
<bar>cat</bar>
<bar2>fish</bar2>
</foo>
XSL
<xsl:value-of select='foo' />
==“鲶鱼”
我不确定你想要实现的输出,我想出了这个(工作演示this XMLPlayground ):
<xsl:template match="doc/articolo">
<xsl:apply-templates />
</xsl:template>
<xsl:template match='titolazione | occhiello | titolo | sommario'>
<xsl:variable name='text'><xsl:value-of select='normalize-space(.)' /></xsl:variable>
<h6>
<xsl:if test='not(string-length($text))'><xsl:attribute name='class'>no-text</xsl:attribute></xsl:if>
<xsl:value-of select='name()' /> (has <xsl:if test='not(string-length($text))'>no </xsl:if> text)
</h6>
<xsl:if test='name() = "titolazione"'><xsl:apply-templates /></xsl:if>
</xsl:template>