2011-08-28 32 views

Respuesta

7

En XPath 2.0, utilice la función estándar deep-equal().

Xpath 1.0 no tiene esta función, por lo tanto, la comparación debe realizarse dentro del lenguaje que aloja XPath.

Puede utilizar esta solución en caso se debe utilizar XPath 1.0: Generate/get xpath from XML node java para obtener una colección de expresiones XPath para cada nodo de Document1 y otra colección de expresiones XPath para cada nodo de Document2. Luego compare las dos colecciones: deben tener el mismo número de expresiones cada una y las expresiones deben ser equivalentes.

Alternativamente, puede generar simplemente verificar que las dos colecciones contienen el mismo número de expresiones y aplicar cada una de las expresiones de Document1 en Document2.

0

He usado una combinación de XSLT 1.0 y Bash para comparar nodos específicos entre sí en función de sus md5sums.

Usando test = "$ index = $ navigator", porque no pude copiar-basado en un nodo [$ navigator] directamente.

<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 

Y una parte de la 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> 
Cuestiones relacionadas