Xml 十六进制实体在UTF字符中更改

Xml 十六进制实体在UTF字符中更改,xml,xslt-2.0,Xml,Xslt 2.0,在我的XML中,当我将其转换为UTF-8时,会出现一些十六进制实体 输入文件: <?xml version="1.0" encoding="UTF-8"?> <root> <a>a text.</a> <b>b &#x2013; text.</b> </root> 文本。 b&x2013;文本。 我的XSLT: <xsl:stylesheet xmlns:xsl="http:/

在我的XML中,当我将其转换为UTF-8时,会出现一些十六进制实体

输入文件:

<?xml version="1.0" encoding="UTF-8"?>
<root>
    <a>a text.</a>
    <b>b &#x2013; text.</b>
</root>

文本。
b&x2013;文本。
我的XSLT:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" exclude-result-prefixes="xs" version="2.0">

    <xsl:output method="xml"/>

    <xsl:template match="@* | node()">
        <xsl:copy>
            <xsl:apply-templates select="@* | node()"/>
        </xsl:copy>
    </xsl:template>

</xsl:stylesheet>
<root>
    <a>a text.</a>
    <b>b – text.</b>
</root>
<?xml version="1.0" encoding="UTF-8"?>
<root>
    <a>a text.</a>
    <b>b &#x2013; text.</b>
</root>

电流输出:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" exclude-result-prefixes="xs" version="2.0">

    <xsl:output method="xml"/>

    <xsl:template match="@* | node()">
        <xsl:copy>
            <xsl:apply-templates select="@* | node()"/>
        </xsl:copy>
    </xsl:template>

</xsl:stylesheet>
<root>
    <a>a text.</a>
    <b>b – text.</b>
</root>
<?xml version="1.0" encoding="UTF-8"?>
<root>
    <a>a text.</a>
    <b>b &#x2013; text.</b>
</root>

文本。
b–文本。
所需输出:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" exclude-result-prefixes="xs" version="2.0">

    <xsl:output method="xml"/>

    <xsl:template match="@* | node()">
        <xsl:copy>
            <xsl:apply-templates select="@* | node()"/>
        </xsl:copy>
    </xsl:template>

</xsl:stylesheet>
<root>
    <a>a text.</a>
    <b>b – text.</b>
</root>
<?xml version="1.0" encoding="UTF-8"?>
<root>
    <a>a text.</a>
    <b>b &#x2013; text.</b>
</root>

文本。
b&x2013;文本。

将角色映射添加到脚本中

<?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" exclude-result-prefixes="xs" version="2.0">

    <xsl:output method="xml" use-character-maps="entity"/>

    <xsl:character-map name="entity">
        <xsl:output-character character="&#x2013;" string="&amp;#x2013;"/>
    </xsl:character-map>

    <xsl:template match="@* | node()">
        <xsl:copy>
            <xsl:apply-templates select="@* | node()"/>
        </xsl:copy>
    </xsl:template>

</xsl:stylesheet>

输出

<?xml version="1.0" encoding="UTF-8"?>
    <root>
        <a>a text.</a>
        <b>b &#x2013; text.</b>
    </root>


将角色映射添加到脚本中,如下所示

<?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" exclude-result-prefixes="xs" version="2.0">

    <xsl:output method="xml" use-character-maps="entity"/>

    <xsl:character-map name="entity">
        <xsl:output-character character="&#x2013;" string="&amp;#x2013;"/>
    </xsl:character-map>

    <xsl:template match="@* | node()">
        <xsl:copy>
            <xsl:apply-templates select="@* | node()"/>
        </xsl:copy>
    </xsl:template>

</xsl:stylesheet>

输出

<?xml version="1.0" encoding="UTF-8"?>
    <root>
        <a>a text.</a>
        <b>b &#x2013; text.</b>
    </root>


了解您为什么需要它会很有用,因为不同的技术可能满足您的需求,也可能不满足您的需求


一种方法是指定US-ASCII作为输出编码。然后,所有非ASCII字符将在输出中显示为数字实体(字符引用)。不幸的是,这也意味着您不能在元素或属性名称中使用非ASCII字符。

了解您为什么需要这些字符会很有用,因为不同的技术可能满足您的要求,也可能不满足您的要求


一种方法是指定US-ASCII作为输出编码。然后,所有非ASCII字符将在输出中显示为数字实体(字符引用)。不幸的是,这也意味着不能在元素或属性名称中使用非ASCII字符。

那么,如果使用UTF-8编码,为什么Unicode字符会成为问题?XSLT处理器使用XML解析器将输入解析到包含Unicode字符的文本节点的树中,它不知道原始输入文档是包含字符引用还是字面上的字符,因此无法保留字符引用。在XSLT 2或更高版本中,您可以定义一个字符映射,将某些字符映射到不同的输出字符串表示形式,这样您就可以定义结果树中的任何破折号都被序列化为字符引用。请参见,如果使用UTF-8编码,为什么Unicode字符会出现问题?XSLT处理器使用XML解析器将输入解析到包含Unicode字符的文本节点的树中,它不知道原始输入文档是包含字符引用还是字面上的字符,因此无法保留字符引用。在XSLT 2或更高版本中,您可以定义一个字符映射,以将某些字符映射到不同的输出字符串表示形式,这样您就可以定义结果树中的任何破折号都被序列化为字符引用。请参阅感谢@Rupesh的回复。实际上,我正在搜索另一个备选方案,因为实体列表并不方便,我们的脚本将运行在线应用程序。如果XML中出现其他实体,那么我们的程序将被卡住,如果您有其他备选方案,请更新。再次非常感谢。@Amrendra,我认为对于这种类型的场景,您需要尝试为您的输入编写一个预处理器,用于转换所有输入&。。;到&;。。;。这将解决您的问题谢谢@Rupesh的回复。实际上,我正在搜索另一个备选方案,因为实体列表并不方便,我们的脚本将运行在线应用程序。如果XML中出现其他实体,那么我们的程序将被卡住,如果您有其他备选方案,请更新。再次非常感谢。@Amrendra,我认为对于这种类型的场景,您需要尝试为您的输入编写一个预处理器,用于转换所有输入&。。;到&;。。;。“那会解决你的问题的谢谢你,@Micheal现在对我来说很有用。”。根据客户的要求,我正在接收XML并将其处理为HTML,在设计和XML中也是如此,但在转换XML后,所有实体都如上所述进行了更改,客户要求在处理后,输出的XML应与我的输入XML完全匹配,以便我需要它。仍然是代码
Franç;ois
,输出为
Franç;ois
让我们看看它们是否正常!感谢您,在XSLT中无法与您的输入进行不精确的匹配:无法区分写为
%
的百分号和写为
%。这也是一个荒谬的要求:有时你不得不告诉客户你比他们更了解这项技术。谢谢你,@Micheal现在为我做这项工作。根据客户的要求,我正在接收XML并将其处理为HTML,在设计和XML中也是如此,但在转换XML后,所有实体都如上所述进行了更改,客户要求在处理后,输出的XML应与我的输入XML完全匹配,以便我需要它。仍然是代码
Franç;ois
,输出为
Franç;ois
让我们看看它们是否正常!感谢您,在XSLT中无法与您的输入进行不精确的匹配:无法区分写为
%
的百分号和写为
%。这也是一个荒谬的要求:有时你必须告诉客户你比他们更了解技术。