2016-12-16 44 views
0

我爲所有的代碼表示歉意,但是我無法消除這些問題而不會混淆問題的明確性。建立一個表格,其中的父母只有具有特定屬性值的兄弟姐妹的值

假設我有這樣的XML:

<Dataset> 
    <Rec RN="FOO"> 
     <Fld FN="ID">ID_1</Fld> 
     <Fld FN="OPT">0</Fld> 
     <Fld FN="DESCRIPTION">DESCRIPTION_1</Fld> 
    </Rec> 
    <Rec RN="BAR" RC="3"> 
     <Fld FN="ID">ID_2</Fld> 
     <Fld FN="TYPE">TYPE_1</Fld> 
    </Rec> 
    <Rec RN="BAR"> 
     <Fld FN="ID">ID_3</Fld> 
     <Fld FN="TYPE">TYPE_2</Fld> 
    </Rec> 
    <Rec RN="FOO"> 
     <Fld FN="ID">ID_4</Fld> 
     <Fld FN="OPT">1</Fld> 
     <Fld FN="DESCRIPTION">DESCRIPTION_2</Fld> 
    </Rec> 
    <Rec RN="BAR" RC="3"> 
     <Fld FN="ID">ID_5</Fld> 
     <Fld FN="TYPE">TYPE_4</Fld> 
    </Rec> 
    <Rec RN="BAR"> 
     <Fld FN="ID">ID_6</Fld> 
     <Fld FN="TYPE">TYPE_5</Fld> 
    </Rec> 
    <Rec RN="SPAM"> 
     <Fld FN="CLASS">CLASS_1</Fld> 
    </Rec> 
</Dataset> 

而下面的XSLT:

<?xml version="1.0" ?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

    <xsl:template match="Dataset"> 
     <html> 
     <head> 
      <link rel="stylesheet" type="text/css" href="On-line Styles.css"/> 
     </head> 
     <body> 
      <p class="subheading"> 
       Commands 
      </p> 
      <p> 
       <xsl:choose> 
        <xsl:when test="Rec[@RN='FOO']"> 
        <xsl:apply-templates select="Rec[@RN='FOO']"/> 
        </xsl:when> 
        <xsl:otherwise> 
        None 
        </xsl:otherwise> 
       </xsl:choose> 
      </p> 
     </body> 
     </html> 
    </xsl:template> 

    <xsl:template match="Rec[@RN='FOO']"> 
     <xsl:for-each select="."> 
     <xsl:value-of select="Fld[@FN='ID']"/> 
     <xsl:if test="Fld[@FN='OPT'] = 1"> 
      (Optional) 
     </xsl:if> 
     - 
     <xsl:value-of select="Fld[@FN='DESCRIPTION']"/> 
     <p> 
      <xsl:choose> 
       <xsl:when test="../Rec[@RN='FOO']"> 
        <table style="border-collapse: separate;" cellspacing="4" border="2" 
        bordercolorlight="#c0c0c0" bordercolordark="#c0c0c0"> 
        <tr bgcolor="#C0C0C0"> 
         <td style="width: 35%; padding: 6px;" valign="top"> 
          <p class="Tableheader" style="margin-bottom: 0;"> 
           <span style="font-weight: bold;">ID</span> 
          </p> 
         </td> 
         <td style="width: 45%; padding: 6px;" valign="top"> 
          <p class="Tableheader" style="margin-bottom: 0;"> 
           <span style="font-weight: bold;">TYPE</span> 
          </p> 
         </td> 
        </tr> 
        <xsl:for-each select="../Rec[@RN='BAR']"> 
         <xsl:if test="preceding-sibling::Rec/@RN='FOO'"> 
          <tr> 
           <td style="padding: 6px;" valign="top"> 
           <p style="margin-bottom: 0;"> 
            <xsl:choose> 
             <xsl:when test="Fld[@FN='ID']"> 
              <xsl:value-of select="Fld[@FN='ID']"/> 
             </xsl:when> 
             <xsl:otherwise> 
              <td>&#xA0;</td> 
             </xsl:otherwise> 
            </xsl:choose> 
           </p> 
           </td> 
           <td style="padding: 6px;" valign="top"> 
           <p style="margin-bottom: 0;"> 
            <xsl:choose> 
             <xsl:when test="Fld[@FN='TYPE']"> 
              <xsl:value-of select="Fld[@FN='TYPE']"/> 
             </xsl:when> 
             <xsl:otherwise> 
              <td>&#xA0;</td> 
             </xsl:otherwise> 
            </xsl:choose> 
           </p> 
           </td> 
          </tr> 
         </xsl:if> 
        </xsl:for-each> 
        </table> 
       </xsl:when> 
      </xsl:choose> 
     </p> 
     </xsl:for-each> 
    </xsl:template> 
</xsl:stylesheet> 

我碰到下面的輸出表:

表1

<table style="border-collapse: separate;" cellspacing="4" border="2" bordercolorlight="#c0c0c0" bordercolordark="#c0c0c0"> 
    <tr bgcolor="#C0C0C0"> 
    <td style="width: 35%; padding: 6px;" valign="top"> 
     <p class="Tableheader" style="margin-bottom: 0;"> 
     <span style="font-weight: bold;">ID</span> 
     </p> 
    </td> 
    <td style="width: 45%; padding: 6px;" valign="top"> 
     <p class="Tableheader" style="margin-bottom: 0;"> 
     <span style="font-weight: bold;">TYPE</span> 
     </p> 
    </td> 
    </tr> 
    <tr> 
    <td style="padding: 6px;" valign="top"> 
     <p style="margin-bottom: 0;">ID_2</p> 
    </td> 
    <td style="padding: 6px;" valign="top"> 
     <p style="margin-bottom: 0;">TYPE_1</p> 
    </td> 
    </tr> 
    <tr> 
    <td style="padding: 6px;" valign="top"> 
     <p style="margin-bottom: 0;">ID_3</p> 
    </td> 
    <td style="padding: 6px;" valign="top"> 
     <p style="margin-bottom: 0;">TYPE_2</p> 
    </td> 
    </tr> 
    <tr> 
    <td style="padding: 6px;" valign="top"> 
     <p style="margin-bottom: 0;">ID_5</p> 
    </td> 
    <td style="padding: 6px;" valign="top"> 
     <p style="margin-bottom: 0;">TYPE_4</p> 
    </td> 
    </tr> 
    <tr> 
    <td style="padding: 6px;" valign="top"> 
     <p style="margin-bottom: 0;">ID_6</p> 
    </td> 
    <td style="padding: 6px;" valign="top"> 
     <p style="margin-bottom: 0;">TYPE_5</p> 
    </td> 
    </tr> 
</table> 

表2

<table style="border-collapse: separate;" cellspacing="4" border="2" bordercolorlight="#c0c0c0" bordercolordark="#c0c0c0"> 
    <tr bgcolor="#C0C0C0"> 
    <td style="width: 35%; padding: 6px;" valign="top"> 
     <p class="Tableheader" style="margin-bottom: 0;"> 
     <span style="font-weight: bold;">ID</span> 
     </p> 
    </td> 
    <td style="width: 45%; padding: 6px;" valign="top"> 
     <p class="Tableheader" style="margin-bottom: 0;"> 
     <span style="font-weight: bold;">TYPE</span> 
     </p> 
    </td> 
    </tr> 
    <tr> 
    <td style="padding: 6px;" valign="top"> 
     <p style="margin-bottom: 0;">ID_2</p> 
    </td> 
    <td style="padding: 6px;" valign="top"> 
     <p style="margin-bottom: 0;">TYPE_1</p> 
    </td> 
    </tr> 
    <tr> 
    <td style="padding: 6px;" valign="top"> 
     <p style="margin-bottom: 0;">ID_3</p> 
    </td> 
    <td style="padding: 6px;" valign="top"> 
     <p style="margin-bottom: 0;">TYPE_2</p> 
    </td> 
    </tr> 
    <tr> 
    <td style="padding: 6px;" valign="top"> 
     <p style="margin-bottom: 0;">ID_5</p> 
    </td> 
    <td style="padding: 6px;" valign="top"> 
     <p style="margin-bottom: 0;">TYPE_4</p> 
    </td> 
    </tr> 
    <tr> 
    <td style="padding: 6px;" valign="top"> 
     <p style="margin-bottom: 0;">ID_6</p> 
    </td> 
    <td style="padding: 6px;" valign="top"> 
     <p style="margin-bottom: 0;">TYPE_5</p> 
    </td> 
    </tr> 
</table> 

我需要的是爲每個表僅僅用於<Rec RN="BAR">小號以下的<Rec RN="FOO">顯示ID和TYPE文本值和之前的下一個<Rec RN="FOO"><Rec>與另一@RN值。在<Rec RN="FOO">之後可以有1至n個<Rec RN="BAR">。下面的示例示出了輸出我需要:

表1

<table style="border-collapse: separate;" cellspacing="4" border="2" bordercolorlight="#c0c0c0" bordercolordark="#c0c0c0"> 
     <tr bgcolor="#C0C0C0"> 
     <td style="width: 35%; padding: 6px;" valign="top"> 
      <p class="Tableheader" style="margin-bottom: 0;"> 
      <span style="font-weight: bold;">ID</span> 
      </p> 
     </td> 
     <td style="width: 45%; padding: 6px;" valign="top"> 
      <p class="Tableheader" style="margin-bottom: 0;"> 
      <span style="font-weight: bold;">TYPE</span> 
      </p> 
     </td> 
     </tr> 
     <tr> 
     <td style="padding: 6px;" valign="top"> 
      <p style="margin-bottom: 0;">ID_2</p> 
     </td> 
     <td style="padding: 6px;" valign="top"> 
      <p style="margin-bottom: 0;">TYPE_1</p> 
     </td> 
     </tr> 
     <tr> 
     <td style="padding: 6px;" valign="top"> 
      <p style="margin-bottom: 0;">ID_3</p> 
     </td> 
     <td style="padding: 6px;" valign="top"> 
      <p style="margin-bottom: 0;">TYPE_2</p> 
     </td> 
     </tr> 
    </table> 

表2

<table style="border-collapse: separate;" cellspacing="4" border="2" bordercolorlight="#c0c0c0" bordercolordark="#c0c0c0"> 
     <tr bgcolor="#C0C0C0"> 
     <td style="width: 35%; padding: 6px;" valign="top"> 
      <p class="Tableheader" style="margin-bottom: 0;"> 
      <span style="font-weight: bold;">ID</span> 
      </p> 
     </td> 
     <td style="width: 45%; padding: 6px;" valign="top"> 
      <p class="Tableheader" style="margin-bottom: 0;"> 
      <span style="font-weight: bold;">TYPE</span> 
      </p> 
     </td> 
     </tr> 
     <tr> 
     <td style="padding: 6px;" valign="top"> 
      <p style="margin-bottom: 0;">ID_5</p> 
     </td> 
     <td style="padding: 6px;" valign="top"> 
      <p style="margin-bottom: 0;">TYPE_4</p> 
     </td> 
     </tr> 
     <tr> 
     <td style="padding: 6px;" valign="top"> 
      <p style="margin-bottom: 0;">ID_6</p> 
     </td> 
     <td style="padding: 6px;" valign="top"> 
      <p style="margin-bottom: 0;">TYPE_5</p> 
     </td> 
     </tr> 
    </table> 
+0

這是非常難以閱讀。假設你想爲每個'提供一個表格,對於每個「後面的一行,它會是正確的嗎? –

+0

是的。我認爲你的答案將起作用。我會試一試,並接受它作爲答案,如果它的工作。謝謝! –

回答

1

如果我理解這個正確(這不是在所有的某些),則想要做這樣的事情:

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

<xsl:key name="rows" match="Rec[@RN='BAR']" use="generate-id(preceding-sibling::Rec[@RN='FOO'][1])" /> 

<xsl:template match="/Dataset"> 
    <html> 
     <body> 
      <xsl:apply-templates select="Rec[@RN='FOO']"/> 
     </body> 
    </html> 
</xsl:template> 

<xsl:template match="Rec[@RN='FOO']"> 
    <table border="1"> 
     <tr> 
      <th>ID</th> 
      <th>TYPE</th> 
     </tr> 
     <xsl:apply-templates select="key('rows', generate-id())"/> 
    </table> 
    <p/> 
</xsl:template> 

<xsl:template match="Rec[@RN='BAR']"> 
    <tr> 
     <td> 
      <xsl:value-of select="Fld[@FN='ID']"/> 
     </td> 
     <td> 
      <xsl:value-of select="Fld[@FN='TYPE']"/> 
     </td> 
    </tr> 
</xsl:template> 

</xsl:stylesheet> 

應用到您的示例輸入,結果將是:

<html> 
    <body> 
     <table border="1"> 
     <tr> 
      <th>ID</th> 
      <th>TYPE</th> 
     </tr> 
     <tr> 
      <td>ID_2</td> 
      <td>TYPE_1</td> 
     </tr> 
     <tr> 
      <td>ID_3</td> 
      <td>TYPE_2</td> 
     </tr> 
     </table> 
     <p></p> 
     <table border="1"> 
     <tr> 
      <th>ID</th> 
      <th>TYPE</th> 
     </tr> 
     <tr> 
      <td>ID_5</td> 
      <td>TYPE_4</td> 
     </tr> 
     <tr> 
      <td>ID_6</td> 
      <td>TYPE_5</td> 
     </tr> 
     </table> 
     <p></p> 
    </body> 
</html> 

呈現爲:

enter image description here