С детства известно: если сожрал конфеты, то заворачивать камешки в фантик — последнее дело.
В данном случае разочаровывающий фантик выглядит примерно так:
<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>
</xsl:text>
<xsl:value-of select="boolean( normalize-space( child2 ) )"/><xsl:text>
</xsl:text>
<xsl:value-of select="boolean( normalize-space( child3 ) )"/><xsl:text>
</xsl:text>
<xsl:value-of select="boolean( normalize-space( child4 ) )"/><xsl:text>
</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>
</xsl:text>
<xsl:value-of select="boolean( string (child2) )"/><xsl:text>
</xsl:text>
<xsl:value-of select="boolean( string (child3) )"/><xsl:text>
</xsl:text>
<xsl:value-of select="boolean( string (child4) )"/><xsl:text>
</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"
Ярослав // 23 декабря 2010 в 11:21
“В обоих случаях мы получим:”
а значений не два, а четыре ;-)
Flack // 23 декабря 2010 в 11:30
Ярослав, я таки имел ввиду два разных куска кода :)
Ярослав // 23 декабря 2010 в 12:30
Flack, пардон, не проснулся еще =)