检测传入的XML“CR”字符,然后转换为<br/>

时间:2010-10-01 14:21:21

标签: xml xslt msxml

我在ASP中使用XSLT,它由msxml6提供服务。

加载到对象的传入XML有“回车”,我认为可能是ASCII 10.我想在输出中将它们转换为<br/>

我正在尝试检测传入XML中的&#10;,但似乎无法找到它。我试过Javascript(ASP内部的JScript),但没有用。

有趣的是,它来自MS Excel电子表格。

想法:

  • 如何在msxsm6
  • 中的XML对象中编码
  • 如何检测,然后替换为<br/>

谢谢大家,stackoverflow很棒!!

3 个答案:

答案 0 :(得分:6)

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

  

经常存储XML解析的实体   在计算机文件中,用于编辑   方便,组织成行。   这些线通常由分隔线组成   某些角色的组合   CARRIAGE RETURN(#xD)和LINE FEED   (#xA)。

     

为了简化应用程序的任务,   XML处理器必须表现得像它一样   规范化外部的所有换行符   解析实体(包括   文件实体)在输入之前   解析,翻译两者   双字符序列#xD #xA和任何   #{1}}后面没有#xA到单个#xA字符。

因此,可以查找#xD(或&#xA;)。但请注意,根据XML树提供程序(MSXSL XML解析器不保留此文本节点),输入中的空白文本节点可能会保留也可能不会保留。当然,不保留仅空白区域的文本节点。

然后,这个&#10;命名模板在XSLT 1.0中用空text元素替换新行:

br

使用此输入:

<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>

答案 1 :(得分:0)

replace(replace(replace(XMLString, vbCrLf, ""), vbCr, ""), vbLf, "")

答案 2 :(得分:-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>