Xsl:如何确定节点或其后代是否包含文本

时间:2013-08-01 09:39:12

标签: xml xslt xpath xslt-1.0

我在查找节点或包含文本方面遇到了一些困难。

考虑以下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”的错误。即使有文本,它也会添加“无文本”类。我想也许原因可能不包含在

标签中,而是包含在嵌套标签中(我可能有更多的嵌套级别)。

知道如何纠正它吗?

全部谢谢。

2 个答案:

答案 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>