Используйте
div/text()[string-length(normalize-space()) > 0]
Это выражение, когда оценивается с родительским элементом предоставленного фрагмента XML в качестве узла контекста, выбирает все дочерние элементы текстового узла не только для пробелов любого любого div
дочернего элемента узла контекста.
Вот полная проверка :
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text"/>
<xsl:template match="/*">
<xsl:for-each select=
"div/text()[string-length(normalize-space()) > 0]">
"<xsl:value-of select="."/>"
<xsl:text>
</xsl:text>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
когда это преобразование применяется к предоставленному фрагменту XML (завернутый в верхний элемент, чтобы стать правильно сформированным документом XML):
<t>
<div>
<div>not this</div>
1<br/>
<div>not this</div>
1<br/>
1<br/>
<div>not this</div></div>
<div>
<div>not this</div>
2
<div>not this</div>
2
2
<div>not this</div></div>
<div>
<div>not this</div>
3
<div>not this</div>
3
3
<div>not this</div></div>
</t>
желаемый, правильный результат получается:
"
1"
"
1"
"
1"
"
2
"
"
2
2
"
"
3
"
"
3
3
"