假设我有一个abc.xml和一个sample.xsl,它将我的abc.xml转换为123.xml。
现在给定转换后的XML和样式表sample.xsl有一种方法可以取回我原来的abc.xml文件。
是否可以使用XSLT实现这一目标?
答案 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存储到源文档中,如果不移动,可以通过简单地指向该文件来重建原始文档。