Xml 如何在结果树中保留源树中的转义字符?

Xml 如何在结果树中保留源树中的转义字符?,xml,xslt,Xml,Xslt,我正在编写一个XSL,用于将一个XML文件转换为另一个XML文件。源代码树包含&。我想把它保存在结果树中,但输出后,它就变成了一个裸的& 我的具有以下属性:method=“xml”、version=“1.0”、encoding=“UTF-8”、standalone=“yes” 我已经尝试过为&(不能这样做,因为裸&是无效的XML,XSL是XML)使用字符映射,用于&(与任何内容都不匹配)和&;amp(不止一个字符,因此不能放入的@character中 如果我将&;的源XM

我正在编写一个XSL,用于将一个XML文件转换为另一个XML文件。源代码树包含
&。我想把它保存在结果树中,但输出后,它就变成了一个裸的&

我的
具有以下属性:method=“xml”、version=“1.0”、encoding=“UTF-8”、standalone=“yes”

我已经尝试过为&(不能这样做,因为裸&是无效的XML,XSL是XML)使用字符映射,用于
&(与任何内容都不匹配)和
&;amp(不止一个字符,因此不能放入
的@character中

如果我将
&;
的源XML实例更改为
&;
,则XSL输出具有所需的
&;
。但是,我不想在该过程中引入其他步骤

我也尝试过制作输出html。这没有帮助

我试图对可能包含
&;
的结果节点使用cdata节元素,但从解析器得到一个错误:{cdata节元素}的值必须是以“{uri}本地”表示法的QName列表

<?xml version="1.0" encoding="UTF-8"?>
<PRESENTATION>
    <CONTROL_ID>3199846</CONTROL_ID>
    <PRESENTATION_ID>2726948</PRESENTATION_ID>
    <SESSION_TRACK>abc</SESSION_TRACK>
    <FINAL_ID>4</FINAL_ID>
    <TITLE>abc</TITLE>
    <STATUS>Sessioned</STATUS>
    <AUTHORS>
        <AUTHOR order="1" person_id="5811496" presenter="true">
            <FNAME>Newhart</FNAME>
            <MNAME/>
            <LNAME>Bob</LNAME>
            <EMAIL>newhart@bob.com</EMAIL>
            <DEGREE/>
            <AFFILIATIONS>
                <AFFL author_order="1" number="1">
                    <DEPT>Psychiatry &amp; Other things</DEPT>
                    <INST>Zippers</INST>
                    <CITY>Frankfurt</CITY>
                    <STATE>Hesse</STATE>
                    <COUNTRY>Germany</COUNTRY>
                </AFFL>
            </AFFILIATIONS>
        </AUTHOR>
    </AUTHORS>
    <BODY>
        <SECTION part_of_body="0">
            <SECTION_NAME bold="true"
                italic="false"
                underline="false"
                name_appears="true">Abstract</SECTION_NAME>
            <TEXT>This will not be relevant.</TEXT>
        </SECTION>
    </BODY>
</PRESENTATION>

3199846
2726948
abc
4.
abc
会期
纽哈特
上下快速移动
newhart@bob.com
精神病学和其他东西
拉链
法兰克福
黑森
德国
摘要
这与此无关。


您已使用disable output escaping=“yes”明确要求处理器不要转义与。如果要转义,则不要禁用转义。

您的模板匹配
“text()
包含
xsl:value of
指令和
disable output escaping=“yes”"
。这会导致输入的
$amp;
在输出中丢失转义。请删除此属性以获得所需的结果。谢谢。我对XSL非常陌生,最近有人向我透露了这一点。我对该属性不熟悉,后来才知道它现在不常使用。出于我从未理解的原因,
禁用它e-output-escaping
经常被不知道它的作用但认为它可能有用的人作为“神奇的精灵灰尘”添加到样式表中。
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns:xs="http://www.w3.org/2001/XMLSchema" version="2.0">

    <xsl:output method="xml"
                version="1.0"
                encoding="UTF-8"
                standalone="yes"/>


    <xsl:template match="/">
                    <xsl:choose>
                        <xsl:when test="/PRESENTATION/AUTHORS/AUTHOR">
                            <contrib-group>
                                <!-- Handle 1 or more authors -->
                                <xsl:for-each select="/PRESENTATION/AUTHORS/AUTHOR">
                                    <xsl:variable name="currentAuthor" select="current()"/>
                                    <contrib>
                                        <name name-style="western">
                                            <surname>
                                                <xsl:value-of select="$currentAuthor/LNAME"/>
                                            </surname>
                                            <given-names>
                                                <xsl:value-of select="$currentAuthor/FNAME"/>
                                                <xsl:if test="matches($currentAuthor/MNAME, '.+')">
                                                    <xsl:value-of select="concat(' ', ./MNAME)"/>
                                                </xsl:if>
                                            </given-names>
                                        </name>

                                        <xsl:for-each select="/$currentAuthor/AFFILIATIONS/AFFL">
                                            <xsl:variable name="currentAff" select="current()"/>
                                            <xsl:if test="position() = 1">
                                                <aff>
                                                    <xsl:if test="$currentAff/DEPT">
                                                        <xsl:apply-templates select="$currentAff/DEPT"/>
                                                    </xsl:if>

                                                    <xsl:if test="$currentAff/INST">
                                                        <institution>
                                                            <xsl:apply-templates select="$currentAff/INST"/>
                                                        </institution>
                                                    </xsl:if>
                                                </aff>
                                            </xsl:if>
                                        </xsl:for-each>

                                    </contrib>
                                </xsl:for-each>
                            </contrib-group>
                        </xsl:when>    
                    </xsl:choose>
    </xsl:template>


    <xsl:template match="text()">
        <xsl:if test="position() > 1">
            <xsl:text> </xsl:text>
        </xsl:if>

        <xsl:value-of select="normalize-space(.)" disable-output-escaping="yes"/>

    </xsl:template>

    <xsl:template name="superscript-preserver" match="sup">
        <sup>
            <xsl:value-of select="normalize-space(.)"/>
        </sup>
    </xsl:template>

    <xsl:template name="subscript-preserver" match="sub">
        <sub>
            <xsl:value-of select="normalize-space(.)"/>
        </sub>
    </xsl:template>

    <xsl:template name="italic-space-normalizer" match="i">
        <xsl:value-of select="normalize-space(.)"/>
    </xsl:template>

    <xsl:template name="bold-space-normalizer" match="b">
        <xsl:value-of select="normalize-space(.)"/>
    </xsl:template>

    <xsl:template name="underline-space-normalizer" match="u">
        <xsl:value-of select="normalize-space(.)"/>
    </xsl:template>

    <xsl:template name="br-space-normalizer" match="br">
        <xsl:value-of select="normalize-space(.)"/>
        <xsl:text> </xsl:text>
    </xsl:template>

    <xsl:template name="square-bracket-extractor" match="/PRESENTATION/SESSION_TRACK">
        <!-- extract string between square brackets -->
        <xsl:analyze-string select="." regex="(.+)">
            <xsl:matching-substring>
                <!-- Take the result from the 1st regex match group and do a replacement. -->
                <xsl:sequence select="replace(regex-group(1), 'I&amp;EC', 'I+EC')"/>
            </xsl:matching-substring>
        </xsl:analyze-string>
    </xsl:template>

    <xsl:template name="final-id-format" match="/PRESENTATION/FINAL_ID">
        <xsl:value-of select="format-number(., '0000')"/>
    </xsl:template>

</xsl:stylesheet>