我可以撤消我对XML文件的转换并取回原始文件吗?

时间:2015-09-02 12:37:05

标签: python xml xslt xsd libxml2

假设我有一个abc.xml和一个sample.xsl,它将我的abc.xml转换为123.xml。

现在给定转换后的XML和样式表sample.xsl有一种方法可以取回我原来的abc.xml文件。

是否可以使用XSLT实现这一目标?

2 个答案:

答案 0 :(得分:2)

  

鉴于已转换的XML和样式表sample.xsl有一种方法   找回我原来的abc.xml文件。

这在理论上是不可能的,因为在第一次转换期间可能(并且经常)丢弃信息。这是一个简单的例子:

原始XML

<input>123.4567</input>

<强> XSLT

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="/">
    <output>
        <xsl:value-of select="round(input)" />
    </output>
</xsl:template>

</xsl:stylesheet>

<强>结果

<?xml version="1.0" encoding="UTF-8"?>
<output>123</output>

如您所见,原始小数部分.4567在结果中或样式表中都没有。

在某些(简单)案例中,您可以对原始XML文档的内容做出有根据的猜测,但不能超过这个。

答案 1 :(得分:1)

马蒂亚斯已经说过,这通常是不可能的。假设这是您的输入XML:

<hello>world</hello>

然后使用以下样式表对其进行转换:

<xsl:template match="hello"><world>Not here!</world></xsl:template>

这将生成以下XML:

<world>Not here!</world>

显然,在这种情况下不存在往返转换,生成的XML(通常)是文本文件,并且它不包含转换之前的任何类型的元信息。但是,如果你的转换有某种方式使得往返成为可能,例如通过添加原始XML,那么它就变成了一个微不足道的练习:

<xsl:template match="/">
    <result>
        <original-xml>
            <xsl:copy-of select="."/>
        </original-xml>
        <xsl:apply-templates />
    <result>
</xsl:template>

然后您可以通过执行以下操作来恢复原始文件:

<xsl:template match="original-xml">
    <xsl:copy-of select="." />
</xsl:template>

浪费资源,如果你问我,但是如果这是要求......(虽然,事先警告,由于空白剥离,XML的副本并不总是100%等于原始版本,顺序属性和行结束处理)。

另一种方法是将原始URI存储到源文档中,如果不移动,可以通过简单地指向该文件来重建原始文档。