Character encoding 如何转换HTML编码的XML?

Character encoding 如何转换HTML编码的XML?,character-encoding,xml-serialization,xslt-2.0,Character Encoding,Xml Serialization,Xslt 2.0,我有一个输入XML,比如 <values xsi:type="xsd:string">&lt;Test objectgroupNr="001"/&gt;&lt;bezeichnung&gt;A&amp;amp;B &lt;/bezeichnung&gt;</values> testobjectgroupnr=“001”/bezeichnungA&;amp;B/贝泽希农 其中包含HTML编码字符,我想将其转换

我有一个输入XML,比如

<values xsi:type="xsd:string">&lt;Test objectgroupNr="001"/&gt;&lt;bezeichnung&gt;A&amp;amp;B &lt;/bezeichnung&gt;</values>
testobjectgroupnr=“001”/bezeichnungA&;amp;B/贝泽希农
其中包含HTML编码字符,我想将其转换为“普通”XML编码:

<values xsi:type="xsd:string">
        <Test objectgroupNr="001"/>
        <bezeichnung>A&amp;B</bezeichnung>
</values>

A&;B
我可以改变一些字符

<xsl:character-map name="fischer">
            <xsl:output-character character="&lt;" string="&lt;"/>
            <xsl:output-character character="&gt;" string="&gt;"/>
</xsl:character-map>      
<xsl:output method="xml" use-character-maps="fischer"/>

但输入所有可能的特殊字符,如Ä、Ü、ß等,似乎不是一个好主意

这可以用XSLT简单地实现吗?转换在使用Saxon 8.9的Sonic ESB环境中进行。

根据支持的扩展功能,您应该能够使用

<xsl:template match="values">
  <xsl:copy>
    <xsl:copy-of select="@*"/>
    <xsl:copy-of select="saxon:parse(concat('&lt;root&gt;', ., '&lt;/root&gt;'))/*/node()"/>
  </xsl:copy>
</xsl:template>

您将
xmlns:saxon=”放在哪里http://saxon.sf.net/“
作为样式表中的名称空间声明。

根据扩展功能,支持使用

<xsl:template match="values">
  <xsl:copy>
    <xsl:copy-of select="@*"/>
    <xsl:copy-of select="saxon:parse(concat('&lt;root&gt;', ., '&lt;/root&gt;'))/*/node()"/>
  </xsl:copy>
</xsl:template>


您将
xmlns:saxon=”放在哪里http://saxon.sf.net/“
作为样式表中的名称空间声明。

您使用哪个版本的XSLT 2.0处理器?在Saxon 9的商业版本中,有一个扩展函数可以将字符串解析为XML,这样您就可以使用它了。请参阅。XSLT 3.0也可以在最新的Saxon版本中实现,XPath 3.0也有更适合您的数据的版本,但我不确定Saxon是否已经支持这个版本。但您当然可以将
元素的内容包装在根元素中,然后使用
解析xml
进行解析,只需获取根包装的子节点即可。使用Saxon 8.9并相应地编辑问题。恐怕我没有XSLT/XPath3.0了。您使用哪个版本的XSLT2.0处理器?在Saxon 9的商业版本中,有一个扩展函数可以将字符串解析为XML,这样您就可以使用它了。请参阅。XSLT 3.0也可以在最新的Saxon版本中实现,XPath 3.0也有更适合您的数据的版本,但我不确定Saxon是否已经支持这个版本。但您当然可以将
元素的内容包装在根元素中,然后使用
解析xml
进行解析,只需获取根包装的子节点即可。使用Saxon 8.9并相应地编辑问题。恐怕我没有XSLT/XPath 3.0了。谢谢,这就完成了。我只需要将它与身份转换结合起来,因为它会删除匹配的标记。谢谢,这就完成了。我只需要将它与身份转换结合起来,因为它会删除匹配的标记。