2011-08-28 80 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>