Обнаружение входящего XML-символа "CR", а затем преобразование в - PullRequest
2 голосов
/ 01 октября 2010

Я использую XSLT внутри ASP, он обслуживается msxml6.

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

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

Это происходит из электронной таблицы MS Excel. Интересно.

Идеи о:

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

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

Ответы [ 3 ]

6 голосов
/ 01 октября 2010

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

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

Для упрощения задач приложений процессор XML ДОЛЖЕН вести себя так, как будто он нормализует все разрывы строкво внешних проанализированных сущностях (включая сущность документа) при вводе перед синтаксическим анализом путем преобразования двухсимвольной последовательности #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 голосов
/ 06 октября 2010

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

<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 голосов
/ 01 октября 2010
replace(replace(replace(XMLString, vbCrLf, ""), vbCr, ""), vbLf, "")
...