2016-04-04 1 views
0

Я пытаюсь сравнить два xml с помощью xsl: key, но не уверен, как печатать непревзойденные ключи. В этом сценарии я использую b.xml и сравниваю с a.xml, но он не печатает непревзойденные ключи из b.xml.xsl: ключ, как выбрать непревзойденные значения ключа

a.xml

<root> 
<metas> 
    <meta> 
     <name>x</name> 
     <value>0</value> 
    </meta> 
    <meta> 
     <name>y</name> 
     <value>1</value> 
    </meta> 
    <meta> 
     <name>z</name> 
     <value>1</value> 
    </meta> 
</metas> 

b.xml

<root> 
<metas> 
    <info> 
     <name>a</name> 
     <value>0</value> 
    </info> 
    <info> 
     <name>y</name> 
     <value>1</value> 
    </info> 
    <info> 
     <name>z</name> 
     <value>1</value> 
    </info> 
</metas> 

Желаемый выход:

Table 

       a.xml    b.xml 
    name  missing in a.xml a 
    value  missing in a.xml 0 

    name  x     missing in b.xml 
    value  0     missing in b.xml 

    name  y     y 
    value  1     1 

    name  z     z 
    value  1     1 

My xsl;

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:xs="http://www.w3.org/2001/XMLSchema" 
exclude-result-prefixes="xs" 
version="2.0"> 
<xsl:param name="uri" as="xs:string" select="'b.xml'"/> 
<xsl:param name="b" as="document-node()" select="doc($uri)"/> 
<xsl:key name="bCompare" match="root/metas/info" use="name"/> 
<xsl:template match="/"> 
    <html> 
     <head> 
      <title>Test</title> 
     </head> 
     <body> 
      <table> 
       <tr> 
        <td></td> 
        <th>a.xml</th> 
        <th>b.xml</th> 
       </tr> 
      <xsl:apply-templates/>      
      </table> 
     </body> 
    </html> 
</xsl:template> 
<xsl:template match="metas"> 
    <xsl:apply-templates/> 
</xsl:template> 
<xsl:template match="meta">   
    <xsl:variable name="compare" select="key('bCompare', name, $b)"/> 
    <tr> 
     <th>Name</th> 
     <td> 
      <xsl:value-of select="name"/>    
     </td> 
     <td> 
      <xsl:value-of select="$compare/name"/> 
      <xsl:if test="empty($compare/name)">missing in b.xml</xsl:if> 
     </td> 
    </tr> 
    <tr> 
     <th>Value</th> 
     <td> 
      <xsl:value-of select="value"/> 
     </td> 
     <td> 
      <xsl:value-of select="$compare/value"/> 
      <xsl:if test="empty($compare/value)">missing in b.xml</xsl:if> 
     </td> 
    </tr> 
</xsl:template> 

ответ

2

Вы должны определить ключ для другого направления, а также, то есть <xsl:key name="aCompare" match="root/metas/meta" use="name"/>, то вам необходимо убедиться, что вы обрабатываете эти элементы второго документа с, например, <xsl:apply-templates/><xsl:variable name="main-doc" select="/"/><xsl:apply-templates select="$b//info/meta[not(name = key('bCompare', $main-doc//meta/name, $main-doc))]"/>, а затем вам нужен шаблон

<xsl:template match="info">   
    <xsl:variable name="compare" select="key('aCompare', name, $main-doc)"/> 
    <tr> 
     <th>Name</th> 
     <td> 
      <xsl:value-of select="$compare/name"/> 
      <xsl:if test="empty($compare/name)">missing in a.xml</xsl:if> 
     </td> 
     <td> 
      <xsl:value-of select="name"/>    
     </td> 
    </tr> 
    <tr> 
     <th>Value</th> 
     <td> 
      <xsl:value-of select="$compare/value"/> 
      <xsl:if test="empty($compare/value)">missing in a.xml</xsl:if> 
     </td> 
     <td> 
      <xsl:value-of select="value"/> 
     </td> 
    </tr> 
</xsl:template>