Какое-то древнее дерьмо

Живёт тупо потому, что за хостинг уплачено на годы вперед

Проверка на наличие текстового содержимого в элементе

23 декабря 2010 · Комментариев: 2 · XSLT/XPath, Рецептарий

С детства известно: если сожрал конфеты, то заворачивать камешки в фантик — последнее дело.

В данном случае разочаровывающий фантик выглядит примерно так:

<checks>
    <child></child>
    <child2>
        <grand>    </grand>
    </child2>
    <child3>
        <grand>
            <grand attribute-we-dont-care-about="some value">
                <grand>

                </grand>
            </grand>
        </grand>
    </child3>
    <child4>
        <grand>
            <grand attribute-we-dont-care-about="some value">
                <grand>
                    20
                </grand>
            </grand>
        </grand>
    </child4>
</checks>

Нас интересует только child 4, так как у него есть потомок, в значении которого есть что-то кроме вайтспейсов, а именно “20”. Конфета, другими словами.

Проверить интерес можно так.

<xsl:output method="text"/>
<xsl:template match="checks">
	<xsl:value-of select="boolean( normalize-space( child ) )"/><xsl:text>&#xa;</xsl:text>
	<xsl:value-of select="boolean( normalize-space( child2 ) )"/><xsl:text>&#xa;</xsl:text>
	<xsl:value-of select="boolean( normalize-space( child3 ) )"/><xsl:text>&#xa;</xsl:text>
	<xsl:value-of select="boolean( normalize-space( child4 ) )"/><xsl:text>&#xa;</xsl:text>
</xsl:template>

Здесь мы заодно наблюдаем динамическое приведение типов (или как там это называют нормальные люди). А именно, нодсеты приводятся к строке при вызове normalize-space так же, как если бы мы явно кастанули string.

Если покрасивше, но не всегда удобно:

<xsl:output method="text"/>
<xsl:strip-space elements="*"/>
<xsl:template match="checks">
	<xsl:value-of select="boolean( string (child) )"/><xsl:text>&#xa;</xsl:text>
	<xsl:value-of select="boolean( string (child2) )"/><xsl:text>&#xa;</xsl:text>
	<xsl:value-of select="boolean( string (child3) )"/><xsl:text>&#xa;</xsl:text>
	<xsl:value-of select="boolean( string (child4) )"/><xsl:text>&#xa;</xsl:text>
</xsl:template>

В обоих случаях мы получим:

false
false
false
true

А в реальной жизни это выглядело бы примерно так

<xsl:output method="text"/>

<xsl:template match="checks">
	<xsl:apply-templates select="*[normalize-space()]"/>
</xsl:template>

<xsl:template match="*">
	<xsl:text>Элемент с именем "</xsl:text>
	<xsl:value-of select="local-name()"/>
	<xsl:text>" и текстом "</xsl:text>
	<xsl:value-of select="normalize-space()"/>"
</xsl:template>
Элемент с именем "child4" и текстом "20"

Теги:

Комментариев: 2 ↓

Оставить комментарий