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」の下に occhiello、titolo、および sommario の 3 つのノードがあります。これらの 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

後続のレベルでテキストをチェックする便利な方法の 1 つは、 を使用することvalue-ofです。これは、サブノードを含むノードで実行すると、それらのノードのテキストの連結が返されるためです。

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>
于 2013-08-01T10:06:43.023 に答える