2011-08-28 46 views

回答

7

在XPath 2.0中,使用标准函数deep-equal()

Xpath 1.0没有这样的功能,因此比较需要在托管XPath的语言中执行。

您可以使用此解决方案的情况下,必须使用XPath 1.0Generate/get xpath from XML node java得到XPath表达式的集合为Document1每个节点并为Document2每个节点XPath表达式的另一个集合。然后比较两个集合 - 它们应该具有相同数量的表达式,并且表达式必须是相同的。

或者,您可以生成只验证两个集合包含相同数量的表达式和Document2应用每个表达式为Document1

0

我已经使用了XSLT 1.0和Bash的组合,根据它们的md5sums来比较特定的节点。

使用test =“$ index = $ navigator”,因为我无法直接复制基于节点[$ navigator]的内容。

<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:ns="http://www.example.org"> 
    <xsl:output method="xml" omit-xml-declaration="yes"/> 
    <xsl:param name="navigator"/> 
    <xsl:param name="part"/> 

    <xsl:template match="/"> 
    <xsl:for-each select="/ns:mappings/ns:mapping"> 
     <xsl:variable name="index" select="position()" /> 
     <xsl:if test="$index=$navigator"> 
      <xsl:choose> 
       <xsl:when test="$part='source'"> 
        <xsl:copy-of select="ns:source/ns:taxonpath"/> 
       </xsl:when> 
       <xsl:when test="$part='target'"> 
        <xsl:copy-of select="ns:target/ns:taxonpath"/> 
       </xsl:when> 
       <xsl:when test="$part='mapping'"> 
        <xsl:copy-of select="."/> 
       </xsl:when> 
      </xsl:choose> 
     </xsl:if> 
    </xsl:for-each> 
    </xsl:template> 
</xsl:stylesheet> 
mappingcount=$(cat mapping.xml | grep "<mapping>" | wc -l) 
counter=1 

while [ $counter -lt $mappingcount ]; do 
    sourcehash=$(xsltproc --stringparam navigator $counter --stringparam part source compare.xslt mapping.xml | md5sum | cut -d " " -f1) 
    targethash=$(xsltproc --stringparam navigator $counter --stringparam part target compare.xslt mapping.xml | md5sum | cut -d " " -f1) 

    if [ "$sourcehash" == "$targethash" ]; then 
     xsltproc --stringparam navigator $counter --stringparam part mapping compare.xslt mapping.xml 
    fi 
    let counter=counter+1 
done 

而且mapping.xml的一部分

<mappings xmlns="http://www.example.org"> 
    <mapping> 
    <source> 
     <taxonpath> 
     <taxon> 
      <id>c001f86a-4f8f-4420-bd78-381c615ecedc</id> 
      <entry>Aardrijkskunde</entry> 
     </taxon> 
     <taxon> 
      <id>65c33fa0-420a-4399-a6f8-595294179df3</id> 
      <entry>Weer en klimaat</entry> 
     </taxon> 
     </taxonpath> 
    </source> 
    <relationship>ter info</relationship> 
    <target> 
     <taxonpath> 
     <taxon> 
      <id>c001f86a-4f8f-4420-bd78-381c615ecedc</id> 
      <entry>Aardrijkskunde</entry> 
     </taxon> 
     <taxon> 
      <id>65c33fa0-420a-4399-a6f8-595294179df3</id> 
      <entry>Systeem aarde</entry> 
     </taxon> 
     </taxonpath> 
    </target> 
    </mapping> 
</mappings>