Xml 如何在结果树中保留源树中的转义字符?
我正在编写一个XSL,用于将一个XML文件转换为另一个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
&文本节点中的代码>。我想把它保存在结果树中,但输出后,它就变成了一个裸的&
我的
具有以下属性: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 & 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&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>