2010-10-01 3 views
1

Я использую XSLT внутри ASP, он обслуживается msxml6.Обнаружение входящего символа XML «CR», затем преобразование в <br/>

Входящий XML, загруженный в объект, имеет «возврат каретки», который, я думаю, может быть ASCII 10. Я хотел бы преобразовать их в <br/> в вывод.

Я пытаюсь обнаружить &#10; во входящем XML, но, похоже, это не находит. Я пробовал Javascript (JScript внутри ASP), безрезультатно.

Это происходит из MS Excel spreadsheetML, интересно.

Идеи по:

  • , как он закодирован в объекте XML внутри msxsm6
  • как обнаружить, а затем заменить <br/>?

Спасибо всем, stackoverflow отлично!

ответ

5

От http://www.w3.org/TR/2008/REC-xml-20081126/#sec-line-ends

XML проанализирована структура часто хранится в компьютерных файлах, которые, для редактирования удобства, которые организованы в линию . Эти линии обычно разделяются некоторой комбинацией символов ПЕРЕВОЗКА ПЕРЕВОЗКИ (#xD) и LINE FEED (#xA).

Для упрощения задачи приложений, процессор XML должен вести себя так, как будто он нормализуется все разрывы строк во внешних проанализированных (включая сущность документа) на входе до синтаксических, переводя как два -character sequence #xD #xA и любой #xD, за которым не следует #xA на один символ #xA.

Итак, это нормально искать &#xA; (или &#10;). Но обратите внимание, что только белые текстовые узлы из ввода могут сохраняться или не сохраняться в зависимости от поставщика дерева XML (синтаксический анализатор XML MSXSL не сохраняет эти текстовые узлы). Конечно, не пустое пространство, но только текстовые узлы.

Затем этот text назвал шаблон заменить новые строки с пустыми br элементов в XSLT 1.0:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" indent="yes"/> 
    <xsl:template match="node()|@*"> 
     <xsl:copy> 
      <xsl:apply-templates select="node()|@*"/> 
     </xsl:copy> 
    </xsl:template> 
    <xsl:template match="text()" name="text"> 
     <xsl:param name="pString" select="."/> 
     <xsl:choose> 
      <xsl:when test="contains($pString,'&#xA;')"> 
       <xsl:call-template name="text"> 
        <xsl:with-param name="pString" 
        select="substring-before($pString,'&#xA;')"/> 
       </xsl:call-template> 
       <br/> 
       <xsl:call-template name="text"> 
        <xsl:with-param name="pString" 
        select="substring-after($pString,'&#xA;')"/> 
       </xsl:call-template> 
      </xsl:when> 
      <xsl:otherwise> 
       <xsl:value-of select="$pString"/> 
      </xsl:otherwise> 
     </xsl:choose> 
    </xsl:template> 
</xsl:stylesheet> 

С этим входом:

<root> 
<text> 
whatever 
</text> 
<text>and more</text> 
</root> 

Выход:

<root> 
<text><br />whatever<br /></text> 
<text>and more</text> 
</root> 
+0

@Alejandro: +1 для правильного ответа и хорошего объяснения! –

+0

Yay Alejandro, это было мертво. Затем я отправлю свой вопрос о DOCTYPE в msmxl6, который кажется нерабочим. Спасибо! – Dave

+0

@ Дэйв: Вы хорошо! Спросите в любое время. – 2010-10-03 18:34:24

0
replace(replace(replace(XMLString, vbCrLf, ""), vbCr, ""), vbLf, "") 
-1

Вот шаблон, который я использую для этого:

<xsl:template name="nl2br"> 
     <xsl:param name="contents" /> 

     <xsl:choose> 
       <xsl:when test="contains($contents, '&#10;')"> 
         <xsl:value-of select="substring-before($contents, '&#10;')" disable-output-escaping="yes" /> 
         <br /> 
         <xsl:call-template name="nl2br"> 
           <xsl:with-param name="contents" select="substring-after($contents, '&#10;')" /> 
         </xsl:call-template> 
       </xsl:when> 
       <xsl:otherwise> 
         <xsl:value-of select="$contents" disable-output-escaping="yes" /> 
       </xsl:otherwise> 
     </xsl:choose> 
</xsl:template> 
+0

Не используйте 'disable-output-escaping =" yes ". Это приведет к искажению XML, если обработанный документ содержит объекты. ' text-1 & текст-2 текст-3' будет преобразован в ' text-1 & text-2
text-3
' – jasso