Я сталкивался с этой проблемой вне .net, которая воспроизводима [для меня] как в <xsl:output method="xml">
, так и <xsl:output method="xhtml">
(я предполагаю, что method="html"
неприменимо к нашему сценарию, где вывод имеет быть правильно сформированным xml)
Чтобы избежать разрушения тега textarea, мы должны вставить в него некоторый контент, но мы также должны избегать вмешательства в фактический контент. Следующее:
<xsl:if test="not(normalize-space())"><xsl:comment></xsl:comment></xsl:if>
дает правильные результаты (то есть предотвращает самозакрытие пустого textarea
и не вводит искусственное содержимое). Я полагаю, что такое поведение упоминается в спецификации под конструкцией узла из набора данных после проверки схемы , где значения строк пустых комментариев станут строками нулевой длины; однако формулировка документа слишком сложна для чтения днем.
Продвигая его немного дальше (, поэтому, если он не вмешивается в содержание, нам действительно нужно xsl:if
? ), это последний шаблон, который предотвращает свертывание определенных тегов (я стремлюсь к следуйте шаблону тождественного преобразования ):
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="textarea">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
<xsl:comment></xsl:comment>
</xsl:copy>
</xsl:template>
Примечание: поведение браузеров предполагает, что это преобразование должно применяться и к некоторым другим элементам, таким как абзацы. Однако наличие самозакрывающегося <p/>
не так разрушительно, как наличие самозакрывающегося <textarea/>
!