我有两个xml文件,具有相同的结构,我想基于它们的内容生成一个具有相同结构的新xml文件。 例如:
File1.xml
<?xml version="1.0" encoding="UTF-8"?>
<coverage>
<project timestamp="1369233123077" name="Project1">
<metrics conditionals="664" methods="117" classes="13" files="9" coveredstatements="1554" />
</project>
</coverage>
File2.xml
<?xml version="1.0" encoding="UTF-8"?>
<coverage>
<project timestamp="1369224383368" name="Project1">
<metrics conditionals="684" methods="122" classes="13" files="9" coveredstatements="1654" />
</project>
</coverage>
我希望得到的结果文件,它包含相同属性的子代码。 File3.xml
<?xml version="1.0" encoding="UTF-8"?>
<coverage>
<project timestamp1="1369233123077" timestamp2="1369224383368" name="Project1">
<metrics conditionals="20" methods="5" classes="0" files="0" coveredstatements="100" />
</project>
</coverage>
我尝试使用File1.xml进行XSL并设法显示上面的结果,但我希望在硬盘上创建一个新的XML文件。 有办法吗?
答案 0 :(得分:1)
你没有说解决方案是否需要处理多个项目,所以我认为答案是“是的,可能有多个项目”。您也不会说您是否可以使用XSLT 2.0或者使用XSLT 1.0。
t:\ftemp>type file1.xml
<?xml version="1.0" encoding="UTF-8"?>
<coverage>
<project timestamp="1369233123077" name="Project1">
<metrics conditionals="664" methods="117" classes="13" files="9" coveredstatements="1554" />
</project>
</coverage>
t:\ftemp>type file2.xml
<?xml version="1.0" encoding="UTF-8"?>
<coverage>
<project timestamp="1369224383368" name="Project1">
<metrics conditionals="684" methods="122" classes="13" files="9" coveredstatements="1654" />
</project>
</coverage>
t:\ftemp>call xslt2 talleen.xsl talleen.xsl
<?xml version="1.0" encoding="UTF-8"?>
<coverage>
<project timestamp1="1369224383368"
timestamp2="1369233123077"
name="Project1">
<metrics conditionals="20"
methods="5"
classes="0"
files="0"
coveredstatements="100"/>
</project>
</coverage>
t:\ftemp>type talleen.xsl
<?xml version="1.0" encoding="US-ASCII"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="2.0">
<xsl:key name="projects" match="project" use="@name"/>
<xsl:output indent="yes"/>
<xsl:template match="/">
<xsl:apply-templates select="doc('file2.xml')/node()"/>
</xsl:template>
<xsl:template match="project">
<xsl:variable name="other" select="key('projects',@name,doc('file1.xml'))"/>
<project timestamp1="{@timestamp}" timestamp2="{$other/@timestamp}"
name="{@name}">
<metrics>
<xsl:for-each select="metrics/@*">
<xsl:attribute name="{name(.)}"
select=". - $other/metrics/@*[name()=name(current())]"/>
</xsl:for-each>
</metrics>
</project>
</xsl:template>
<xsl:template match="@*|node()"><!--identity for all other nodes-->
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
t:\ftemp>rem Done!
答案 1 :(得分:0)
您说您已经编写了所需的XSLT代码但是您不知道如何将结果保存为硬盘上的文件?
那是关于您选择的XSLT处理器的API的问题,因此我们需要知道您正在使用哪个XSLT处理器以及如何运行它。