一旦使用xml中的XSLT,找到具有不同值的公共节点和uncommone节点

时间:2013-11-13 14:41:12

标签: xml xslt

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
    <SEGMEM>
      <FIELD>
        <Entry type="Field">
          <MemoryVariable>x</MemoryVariable>
          <Variable>x(v9)</Variable>
          <offset>
            <lowerBound>0</lowerBound>
            <upperBound>31</upperBound>
          </offset>
        </Entry>
        <Entry type="Field">
          <MemoryVariable>LE</MemoryVariable>
          <Variable>LE(v10)</Variable>
          <offset>
            <lowerBound>0</lowerBound>
            <upperBound>0</upperBound>
          </offset>
        </Entry>
     </FIELD>
    <CONGRUENCES>
        <Entry type="congruence">
          <Variable>v6</Variable>
          <Value>
            <multiplier>0</multiplier>
            <offset>1</offset>
          </Value>
        </Entry>
        <Entry type="congruence">
          <Variable>x(v9)</Variable>
          <Value>
            <multiplier>1</multiplier>
            <offset>0</offset>
          </Value>
        </Entry>
      </CONGRUENCES>
    </SEGMEM> 

我上面有XML。我需要搜索<Entry type="Field"><Entry type="congruence">中常见的变量元素。变量只显示一次。

输出应如下:

<table border="1">
      <tr bgcolor="#9acd32">
        <th>MemoryVariable</th>
        <th>Variable</th>
        <th>lowerbound/upperbound</th>
        <th>multiplier/offset</th>
      </tr>
     <tr>
         <td>x</td>      <!-- memory variable -->
         <td>x(v9)</td>  <!-- x(v9) is the in file and congruence entry -->
         <td>[0,31]</td> <!-- lowerbound and upperbound -->
         <td>[1,0]</td>  <!-- <multiplier>1</multiplier> <offset>0</offset> -->
       </tr>
      <tr>
         <td>LE</td>     <!-- memory variable again -->
         <td>LE(v10)</td><!-- LE(v10) is the in file and not in congruence entry -->
         <td>[0,0]</td>  <!-- lowerbound and upperbound -->
         <td>null</td>   <!-- <multiplier>null</multiplier> <offset>null</offset> -->
      </tr>
      <tr>
         <td>null</td>   <!-- memory variable again -->
         <td>v6</td>     <!-- v6 is the not in file but in congruence entry -->
         <td>null</td>   <!-- lowerbound and upperbound -->
         <td>[0,1]</td>  <!-- <multiplier>0</multiplier> <offset>1</offset> -->
    </tr>
</table>   

任何专家都可以提供解决方案吗?我无法解决它。

1 个答案:

答案 0 :(得分:1)

<!-- index Entries by their Values -->
<xsl:key name="fields" match="FIELD/Entry" use="Variable" />
<xsl:key name="congruence" match="CONGRUENCES/Entry" use="Variable" />

<xsl:template match="SEGMEM">
  <table border="1">
    <tr bgcolor="#9acd32">
      <th>MemoryVariable</th>
      <th>Variable</th>
      <th>Bounds</th>
      <th>Congruence</th>
    </tr>
    <xsl:apply-templates select=".//Entry" />
  </table>
</xsl:template>

<xsl:template match="Entry[parent::FIELD]">
  <!-- find matching conguruence entry -->
  <xsl:variable name="c" select="key('congruence', Variable)" />
  <tr>
    <td><xsl:value-of select="MemoryVariable" /></td>
    <td><xsl:value-of select="Variable" /></td>
    <td><xsl:apply-templates select="offset" mode="bracket" /></td>
    <td>
      <xsl:choose>
        <xsl:when test="$c"><xsl:apply-templates select="$c/Value" mode="bracket" /></xsl:when>
        <xsl:otherwise>null</xsl:otherwise>
      </xsl:choose>
    </td>
  </tr>
</xsl:template>

<xsl:template match="Entry[parent::CONGRUENCES]">
  <!-- only output this if there is no matching field entry -->
  <xsl:if test="not(key('fields', Variable))">
    <tr>
      <td>null</td>
      <td><xsl:value-of select="Variable" /></td>
      <td>null</td>
      <td><xsl:apply-templates select="Value" mode="bracket" /></td>
    </tr>
  </xsl:if>
</xsl:template>

<xsl:template match="*" mode="bracket">
  <xsl:value-of select="concat('[', *[1], ',', *[2], ']')" />
</xsl:template>

给你

<table border="1">
  <tr bgcolor="#9acd32">
    <th>MemoryVariable</th>
    <th>Variable</th>
    <th>Bounds</th>
    <th>Congruence</th>
  </tr>
  <tr>
    <td>x</td>
    <td>x(v9)</td>
    <td>[0,31]</td>
    <td>[1,0]</td>
  </tr>
  <tr>
    <td>LE</td>
    <td>LE(v10)</td>
    <td>[0,0]</td>
    <td>null</td>
  </tr>
  <tr>
    <td>null</td>
    <td>v6</td>
    <td>null</td>
    <td>[0,1]</td>
  </tr>
</table>

请参阅http://www.xmlplayground.com/P9YpKF