2

我有两个结构相同的 xml 文件,我想根据它们的内容生成一个结构相同的新 xml 文件。例如:

文件1.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>

文件2.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>

我希望得到的结果文件,它包含相同属性的减法。文件3.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 文件。有没有办法做到这一点?

4

2 回答 2

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! 
于 2013-08-11T21:24:57.417 回答
0

您是说您已经编写了所需的 XSLT 代码,但您不知道如何将结果保存为硬盘上的文件?

这就是关于您选择的 XSLT 处理器的 API 的问题,因此我们需要知道您正在使用哪个 XSLT 处理器以及您是如何运行它的。

于 2013-08-11T21:24:37.323 回答