1

我很难找出节点或包含文本。

考虑以下 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。我需要创建一个能够理解在这 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”上犯了一个错误。即使有文本,它也会添加“无文本”类。我想也许原因不包含在

标签但在嵌套标签中(我可以有更多的嵌套级别)。

知道如何纠正它吗?

谢谢大家。

4

2 回答 2

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>
于 2013-08-01T09:49:23.053 回答
1

在任何后续级别检查文本的一种有用方法是使用value-of,因为如果在包含子节点的节点上运行,将返回这些节点文本的串联。

XML

<foo>
    <bar>cat</bar>
    <bar2>fish</bar2>
</foo>

XSL

<xsl:value-of select='foo' />

==“鲶鱼”

不确定您要达到的输出,我想出了这个(在这个 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>
于 2013-08-01T10:06:43.023 回答