2017-08-18 22 views
-2

我有一個xml如下。我嘗試了一些xsl代碼來轉換爲所需的輸出。但我不能成功。分組和選擇特定節點太難 標記'A'的值是不變的。它們只能是'Math'和'Phys'(類名除外)。我必須將這些值與類名稱分組。如何將XML格式化爲所需的XML

輸入:

<sheet> 
    <Row> 
     <A>Class:X</A> 
    </Row> 
    <Row> 
     <A>Math</A> 
     <E>10</E> 
    </Row> 
    <Row> 
     <A>Phys</A> 
     <E>14</E> 
    </Row> 
     <Row> 
     <A>Class:Y</A> 
    </Row> 
     <Row> 
     <A>Math</A> 
     <E>8</E> 
     </Row> 
     <Row> 
     <A>Phys</A> 
     <E>12</E> 
     </Row> 
    </sheet> 

所需的輸出:

<sheet> 
    <ROW> 
     <class_type>X</class_type> 
     <math>10>/math> 
     <phys>14>/phys> 
    </ROW> 
    <ROW> 
     <class_type>X</class_type> 
     <math>8>/math> 
     <phys>12>/phys> 
    </ROW> 
</sheet> 

我嘗試:

<xsl:template match="/"> 
    <xsl:apply-templates select="/s0:root"/> 
</xsl:template> 
<xsl:template match="/s0:root"> 
    <ns0:Sheet> 
       <xsl:for-each select="s0:Row"> 
        <xsl:if test="contains(s0:A/text(),'Class:')"> 
         <ns0:class_type> 
          <xsl:value-of select="substring-after(s0:A/text(),'Class:')"/> 
         </ns0:class_type> 
        </xsl:if> 
        <xsl:if test="contains(s0:A/text(),'Math')"> 
         <ns0:math> 
          <xsl:value-of select="s0:E/text()"/> 
         </ns0:math> 
        </xsl:if> 
        <xsl:if test="contains(s0:A/text(),'Phys')"> 
         <ns0:phys> 
          <xsl:value-of select="s0:E/text()"/> 
         </ns0:phys> 
        </xsl:if> 
       </xsl:for-each> 
    </ns0:Sheet> 
</xsl:template> 
+1

我投票結束這個問題作爲題外話,因爲在這個網站,你應該嘗試**自己寫代碼**。後** [做更多的研究](//meta.stackoverflow.com/questions/261592)**如果你有問題,你可以**發佈你已經嘗試**與清楚的解釋是什麼是'工作**並提供** [最小,完整和可驗證示例](// stackoverflow.com/help/mcve)**。 – Rob

+0

對不起,我的英語,但我渴望了一個星期。我閱讀了所有Xslt文檔和示例。所以我寫了自己的代碼。我不知道你爲什麼會得到這樣的印象 – LeoMessi

+1

您沒有向我們展示您爲解決問題所寫的XSLT。 – Rob

回答

0

這裏你可以看看這一個辦法:

XS LT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 

<xsl:template match="/sheet"> 
    <xsl:copy> 
     <xsl:for-each select="Row[contains(A, 'Class:')]"> 
      <ROW> 
       <class_type> 
        <xsl:value-of select="substring-after(A, 'Class:')"/> 
       </class_type> 
       <math> 
        <xsl:value-of select="following-sibling::Row[A='Math'][1]/E"/> 
       </math> 
       <phys> 
        <xsl:value-of select="following-sibling::Row[A='Phys'][1]/E"/> 
       </phys> 
      </ROW> 
     </xsl:for-each> 
    </xsl:copy> 
</xsl:template> 

</xsl:stylesheet> 

這是假設每一個「類」行有一個「數學」和它後面跟一個「物理」行下一個「類」行走來了。

+0

我的xml更復雜,然後我的示例xml.But你給了我一個idea.i發現跟隨兄弟,就像下面的兄弟姐妹:: * [包含(S0:G /文本(),'數學')]/E/text()thx尋求幫助 – LeoMessi