Как обрабатываются пустые текстовые узлы? - PullRequest
0 голосов
/ 19 сентября 2018

Если я применяю следующий xslt

<xsl:stylesheet version="2.0"
          xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="html" indent="yes"/>

    <xsl:template match="*">
        <xsl:copy><xsl:apply-templates/></xsl:copy>
    </xsl:template>

    <xsl:template match="b/*">
        <xsl:copy><xsl:apply-templates/></xsl:copy>
    </xsl:template>

    <xsl:template match="text()">text</xsl:template>

</xsl:stylesheet>

к следующему xml

<?xml version="1.0"?>

<a>
   <b></b>
</a>

, то получается

<a>
    text
    <b></b>
    text
</a>

Что я не получаю:Все пустые текстовые узлы между элементами обрабатываются, кроме пустого текстового узла внутри элемента b.Я не вижу разницы в том, как обрабатываются дочерние элементы a и b.

Ответы [ 2 ]

0 голосов
/ 20 сентября 2018

На самом деле, по крайней мере в модели 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, поэтому текстовые узлы нулевой длины не могут существовать.

0 голосов
/ 19 сентября 2018

В элементе b нет пустого текстового узла, это пустой элемент, у которого вообще нет дочерних узлов.С другой стороны, элемент a имеет три дочерних узла, первый - текстовый узел с пробелами (по крайней мере, разрыв строки и несколько пробелов или символов табуляции), второй - элемент b, третий -текстовый узел с пробелами (по крайней мере, разрыв строки).

Кроме того, где вы получили этот результат с отступом показанного вами вывода text?На http://xsltransform.hikmatu.com/94hvTyG я получаю вывод <a>text<b></b>text</a>

...