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

Dav*_*ave 2 xml xslt msxml

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

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

我试图&#10;在传入的XML中检测,但似乎无法找到.我试过Javascript(ASP内部的JScript),但无济于事.

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

想法:

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

谢谢大家,stackoverflow很棒!!

小智 6

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

XML解析的实体通常存储在计算机文件中,为方便编辑,这些文件被组织成行.这些行通常由字符CARRIAGE RETURN(#xD)和LINE FEED(#xA)的某种组合分隔.

为了简化的应用程序的任务,XML处理器必须表现得好像它在归一外部解析实体(包括文件实体)上输入所有换行符,解析之前,通过平移二者两个字符序列#xD #xA和任何 #xD其#xA后面没有单个#xA字符.

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

然后,这个text命名模板用brXSLT 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>
Run Code Online (Sandbox Code Playgroud)

有了这个输入:

<root>
<text>
whatever
</text>
<text>and more</text>
</root>
Run Code Online (Sandbox Code Playgroud)

输出:

<root>
<text><br />whatever<br /></text>
<text>and more</text>
</root>
Run Code Online (Sandbox Code Playgroud)