2014-11-21 35 views
0

在下面的代碼我有xml輸入顯示booktypes.I要根據每列中的類型排列圖書類型。有些列的值有些不是。檢查預期的輸出。如何使用xslt插入html單元格值?

輸入

<?xml version="1.0" encoding="UTF-8"?> 
     <BookTypes>  
     <Types> 
      <string>T1</string> 
      <string>T3,M1,P1</string> 
      <string>T2,P2</string> 
      <string>M3,P3</string>  
     </Types>  
     </BookTypes> 

XSLT腳本:當前XSLT腳本給我的結果,但並不如預期。

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:exsl="http://exslt.org/common" 
extension-element-prefixes="exsl"> 
<xsl:output method="xml" omit-xml-declaration="yes" version="1.0" encoding="UTF-8" indent="yes"/> 

<xsl:variable name="types"> 
    <type>T</type> 
    <type>M</type> 
    <type>P</type> 
</xsl:variable> 

<xsl:variable name="types-set" select="exsl:node-set($types)" /> 

<xsl:template match="/"> 
    <table> 
     <tr> 
      <th>T Type</th> 
      <th>M Type</th> 
      <th>P Type</th> 
      </tr> 
     <xsl:for-each select="BookTypes/Types/string"> 
     <tr> 
      <xsl:variable name="splitValue"> 
      <xsl:apply-templates/> 
      </xsl:variable> 
      <xsl:for-each select="exsl:node-set($splitValue)/*"> 
      <xsl:variable name="mySplittedValue" select="." /> 
        <xsl:for-each select="$types-set/type"> 
        <xsl:variable name="my-types" select="." /> 
        <td> 
         <xsl:choose> 
          <xsl:when test="contains($mySplittedValue, $my-types)"> 
           <xsl:value-of select="$mySplittedValue"/> 
          </xsl:when> 
          <xsl:otherwise> 
           <xsl:text>-</xsl:text> 
          </xsl:otherwise> 
         </xsl:choose> 
        </td> 
       </xsl:for-each> 

      </xsl:for-each> 
      </tr> 
    </xsl:for-each> 
    </table>    
</xsl:template> 
<xsl:template match="text()" name="split"> 
    <xsl:param name="pText" select="."/> 
    <xsl:if test="string-length($pText) > 0"> 
     <item> 
     <xsl:value-of select="substring-before(concat($pText, ','), ',')"/> 
     </item> 
     <xsl:call-template name="split"> 
     <xsl:with-param name="pText" select="substring-after($pText, ',')"/> 
     </xsl:call-template> 
    </xsl:if> 
    </xsl:template> 
</xsl:stylesheet> 

預期輸出

<table> 
    <tr> 
     <th>T Type</th> 
     <th>M Type</th> 
     <th>P Type</th> 
    </tr> 
    <tr> 
     <td>T1</td> 
     <td>-</td> 
     <td>-</td> 
    </tr> 
    <tr> 
     <td>T3</td> 
     <td>M1</td> 
     <td>P1</td> 
    </tr> 
    <tr> 
     <td>T2</td> 
     <td>-</td> 
     <td>P2</td> 
    </tr> 
    <tr> 
     <td>-</td> 
     <td>M3</td> 
     <td>P3</td> 
    </tr> 
</table> 

綜述:輸出 有三(3)固定的類型,P,M,T它們是存在於任何一個輸入說P3,M3。這裏P3包含P(type),所以P3的值應該在列名P型下。在輸入中有3或2或1的值由逗號分隔(如T3,M1,P1)。每個值都應該先拆分,然後再顯示在表中

+0

哪些具體XSLT 1.0處理器,您使用的? – 2014-11-24 07:33:25

+0

關於您編輯的(第二)輸出。一個例子不足以解釋變革背後的邏輯。請提供確切的規則 - 例如:字符串的第一個字符,或...? – 2014-11-24 07:53:59

+0

有三種固定類型,P,M,T存在於任何一個輸入中,比如P3,M3。這裏P3包含P(type),所以P3的值應該在列名P型下。在輸入中有3或2或1的逗號分隔的值(如 T3,M1,P1)。每個值應該先拆分,然後根據其類型在表中顯示。 – ADP 2014-11-24 09:32:02

回答

0

我認爲你正在使它變得更加複雜。嘗試:

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:exsl="http://exslt.org/common" 
extension-element-prefixes="exsl"> 
<xsl:output method="xml" omit-xml-declaration="yes" version="1.0" encoding="UTF-8" indent="yes"/> 

<xsl:variable name="types"> 
    <type>T</type> 
    <type>M</type> 
    <type>P</type> 
</xsl:variable> 

<xsl:variable name="types-set" select="exsl:node-set($types)" /> 

<xsl:template match="/"> 
    <table>> 
     <tr> 
      <xsl:for-each select="$types-set/type"> 
       <th><xsl:value-of select="concat(., ' Type')"/></th> 
      </xsl:for-each> 
     </tr> 
     <xsl:for-each select="BookTypes/Types/string"> 
      <xsl:variable name="my-types" select="." /> 
      <tr> 
       <xsl:for-each select="$types-set/type"> 
        <td> 
         <xsl:choose> 
          <xsl:when test="contains($my-types, .)"> 
           <xsl:value-of select="."/> 
          </xsl:when> 
          <xsl:otherwise> 
           <xsl:text>-</xsl:text> 
          </xsl:otherwise> 
         </xsl:choose> 
        </td> 
       </xsl:for-each> 
      </tr> 
     </xsl:for-each> 
    </table>    
</xsl:template> 

</xsl:stylesheet> 

結果

<table> 
    <tr> 
     <th>T Type</th> 
     <th>M Type</th> 
     <th>P Type</th> 
    </tr> 
    <tr> 
     <td>T</td> 
     <td>-</td> 
     <td>-</td> 
    </tr> 
    <tr> 
     <td>T</td> 
     <td>M</td> 
     <td>P</td> 
    </tr> 
    <tr> 
     <td>T</td> 
     <td>-</td> 
     <td>P</td> 
    </tr> 
    <tr> 
     <td>-</td> 
     <td>M</td> 
     <td>P</td> 
    </tr> 
</table> 
+0

答案是正確的,但不適用於我的方案。如果我考慮第二種輸入格式,它將不起作用。我只是爲了放鬆你而不是實際的輸入。說你可以考慮輸入M,P等是IP地址。 – ADP 2014-11-24 07:20:07

+0

@ADP我們只能回答你問的問題,你問他們的方式。如果你的情況不同,那麼編輯你的問題並解釋如何。 – 2014-11-24 07:28:44

+0

我期待第二次輸入的「第二次預期輸出」。請再次查看詳細信息。提供的輸入值附帶M,P,T附件。 – ADP 2014-11-24 07:49:06

相關問題