Уже на 7 лет позже, но для будущих читателей я остановлю эту тенденцию здесь и предложу реальное решение исходного вопроса. Решение, которое не изменяет оригинал пробелами или директивой output.
Идея заключалась в том, чтобы использовать пустую переменную для обмана парсера.
Если вы хотите сделать это только для одного тега B, моей первой мыслью было использовать что-то подобное для присоединения фиктивной переменной.
<xsl:variable name="dummyempty" select="''"/>
<xsl:template match="B">
<xsl:copy>
<xsl:apply-templates select="@*" />
<xsl:value-of select="concat(., $dummyempty)"/>
</xsl:copy>
</xsl:template>
Но я обнаружил, что на самом деле даже фиктивная переменная не нужна. Это сохранило пустые теги, по крайней мере, при тестировании с xsltproc
в Linux:
<xsl:template match="B">
<xsl:copy>
<xsl:apply-templates select="@*" />
<xsl:value-of select="."/>
</xsl:copy>
</xsl:template>
Для более общего решения для обработки ВСЕХ пустых тегов, попробуйте это:
<xsl:variable name="dummyempty" select="''"/>
<xsl:template match="*[. = '']">
<xsl:copy>
<xsl:apply-templates select="node()|@*" />
<xsl:value-of select="$dummyempty"/>
</xsl:copy>
</xsl:template>
Опять же, в зависимости от того, насколько умен ваш парсер, вам может даже не понадобиться фиктивная переменная.