Detecting incoming XML “CR” character, then converting to <br/>

放肆的年华 提交于 2019-12-11 03:43:14

问题


I am using XSLT inside of ASP, it's serviced by msxml6.

Incoming XML loaded to the object has "carriage returns" which I think may be ASCII 10. I would like to transform those to <br/> in the output.

I am trying to detect &#10; in the incoming XML, but can't seem to find that. I've tried Javascript (JScript inside of ASP), to no avail.

It's coming from MS Excel spreadsheetML, interestingly.

Ideas on:

  • how it's encoded in the XML object inside msxsm6
  • how to detect, then replace with <br/>?

Thank you everyone, stackoverflow is great!!


回答1:


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

XML parsed entities are often stored in computer files which, for editing convenience, are organized into lines. These lines are typically separated by some combination of the characters CARRIAGE RETURN (#xD) and LINE FEED (#xA).

To simplify the tasks of applications, the XML processor MUST behave as if it normalized all line breaks in external parsed entities (including the document entity) on input, before parsing, by translating both the two-character sequence #xD #xA and any #xD that is not followed by #xA to a single #xA character.

So, it's ok to look for &#xA; (or &#10;). But do note that white space only text nodes from the input may or may not be preserve depending on XML tree provider (MSXSL XML parser doesn't preserve this text nodes). Not white space only text nodes are preserved, of course.

Then, this text named template replace new lines with empty br elements in 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>

With this input:

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

Output:

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



回答2:


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



回答3:


Here is a template I use to do this:

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


来源:https://stackoverflow.com/questions/3840040/detecting-incoming-xml-cr-character-then-converting-to-br

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!