На самом деле, по крайней мере в модели XSLT 2.0 / 3.0, текстовый узел нулевой длины может существовать, но только если он не имеет родителей;как только вы попытаетесь присоединить его к родительскому элементу, он исчезнет.Поэтому, если вы сделаете:
<xsl:variable name="x" as="node()">
<xsl:text/>
</xsl:variable>
, то count($x)
вернет 1, $x instance of text()
вернет истину, а string-length($x)
вернет 0. Но когда вы сделаете
<xsl:variable name="e" as="node()">
<xsl:copy-of select="$x"/>
</xsl:variable>
, тогда count($x)/child::node()
возвращает 0. Это определяется правилами для построения сложного содержимого (§5.7.1 в XSLT 3.0, правило 6) «Текстовые узлы нулевой длины в последовательности удалены.»
И модель данных XDMопределяет ограничение (§6.7.1, правило 1 в версии 3.1): «Если родительский узел текстового узла не пуст, текстовый узел не должен содержать строку нулевой длины в качестве своего содержимого».
Обратите внимание, что спецификации W3C постоянно используют слово «пустой» для обозначения набора, в котором нет членов, а строка без символов всегда называется «нулевой длины».В моем примере выше $ x имеет нулевую длину, но он не пустой.
Ситуация в XPath 1.0 / XSLT 1.0 отличается.Текстовые узлы без родительского контроля не могут возникать в версии 1.0, поэтому текстовые узлы нулевой длины не могут существовать.