2011-08-28 30 views

Trả lời

7

Trong XPath 2.0, hãy sử dụng hàm chuẩn deep-equal().

Xpath 1.0 không có chức năng như vậy, do đó việc so sánh cần được thực hiện trong ngôn ngữ lưu trữ XPath.

Bạn có thể sử dụng giải pháp này trong trường hợp bạn phải sử dụng XPath 1.0: Generate/get xpath from XML node java để có được một bộ sưu tập các biểu thức XPath cho mỗi nút của Document1 và một bộ sưu tập các biểu thức XPath cho mỗi nút của Document2. Sau đó so sánh hai bộ sưu tập - chúng phải có cùng số biểu thức và các biểu thức phải tương đương nhau.

Hoặc, bạn có thể tạo chỉ xác minh rằng hai bộ sưu tập chứa cùng một số biểu thức và áp dụng từng biểu thức cho Document1 trên Document2.

5

XPath 2.0 có hàm ngang bằng nhau cho điều đó: http://www.w3.org/TR/xpath-functions/#func-deep-equal. XPath 1.0 không có gì so sánh được, bạn sẽ cần phải cuộn của riêng bạn, trong bất kỳ ngôn ngữ máy chủ nào bạn sử dụng XPath 1.0 với.

0

Tôi đã sử dụng kết hợp XSLT 1.0 và Bash để so sánh các nút cụ thể với nhau dựa trên md5sums của chúng.

Sử dụng thử nghiệm = "$ index = $ navigator", vì tôi không thể sao chép dựa trên nút [navigator] trực tiếp.

<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 

Và một phần của 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> 
Các vấn đề liên quan