Использование XSLT для вывода пустого HTML-элемента textarea - PullRequest
7 голосов
/ 16 февраля 2009

При попытке вывести пустой элемент textarea процессор .NET XSLT сворачивает элемент в его краткую форму. Вместо этого:

<textarea id="blah" name="blah"></textarea>

Я получаю это:

<textarea id="blah" name="blah"/>

Что заставляет многие веб-браузеры (включая IE и Firefox) отображать остальную часть страницы, как если бы это было содержимое текстовой области. Это отстой.

Я могу заставить процессор XSLT выводить открывающие и закрывающие теги textarea, если я помещаю что-то между ними, как неразрывный пробел. Но это означает, что мне нужно больше анализировать и проверять на стороне клиента, чтобы определить, когда текстовая область «действительно» пуста. Я также должен использовать JavaScript, чтобы удалить лишнее пространство, чтобы пользователи не начинали свои комментарии с пробела.

Кто-нибудь знает способ заставить процессор XSLT отображать как открывающий, так и закрывающий теги без необходимости вставлять фиктивный контент?

Ответы [ 6 ]

3 голосов
/ 16 февраля 2009

Найдите свой ответ через аналогичный вопрос прямо здесь на Stackoverflow.com: -)

Здесь - дальнейшее объяснение из MSDN.

2 голосов
/ 16 февраля 2009

Если вам нужно использовать фиктивный контент, это был шаблон xsl:, который я использовал, имея только символ перевода строки внутри текстовой области.

<!-- This prevents empty textarea elements being rendered as singletons in the XHTML output by adding a newline character -->
<xsl:template name="xhtml-textarea-contents">
    <!-- what should be contained in the textarea -->
    <xsl:param name="contents" />

    <xsl:choose>
        <xsl:when test="$contents = ''"><xsl:text>&#x0A;</xsl:text></xsl:when>
        <xsl:otherwise><xsl:copy-of select="$contents" /></xsl:otherwise>
    </xsl:choose>
</xsl:template>
1 голос
/ 11 ноября 2013

Я сталкивался с этой проблемой вне .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/>!

1 голос
/ 01 декабря 2009

Если вы генерируете xml или html, вы можете написать новую строку внутри текстовой области, а затем удалить ее с помощью jquery.

Это пример с jQuery:

<textarea>&#160;<textarea>

<script>
 $(document).ready(function(){
    $('textarea').each(
      function(index){$(this).text('');}
     );
  });
</script>
1 голос
/ 16 февраля 2009

У Криса Балланса был ответ, который работал для меня. Но стоит отметить, что я использовал перегрузку XslCompiledTransform, которая выводит в поток, вот так:

XslCompiledTransform transform = new XslCompiledTransform();
...
MemoryStream stream = new MemoryStream();
transform.Transform(reader, args, stream);

Чтобы передать правильные настройки, мне пришлось использовать перегрузку, которая вместо этого приняла XmlWriter.

// using XmlWriter so I can pass the output settings along.
XmlWriter writer = XmlWriter.Create(stream, transform.OutputSettings);
transform.Transform(reader, args, writer);

Microsoft использует там действительно странный шаблон проектирования.

0 голосов
/ 16 апреля 2009

У меня была похожая проблема, и я только что понял, что если для параметра ConformanceLevel для XmlWriterSettings установить значение Fragment, это устранит некоторые причуды XslCompiledTransform.

FileStream xmlFileStream = File.Create("file.xml");
XslCompiledTransform transform = new XslCompiledTransform();
transform.Load("transform.xsl");
XmlWriterSettings settings = new XmlWriterSettings();
settings.ConformanceLevel = ConformanceLevel.Fragment;
XmlWriter xmlWriter = XmlWriter.Create(xmlFileStream, settings);
transform.Transform(sourceXml, null, xmlWriter);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...