2015-06-04 109 views
1

我想基於幾個子元素對一些XML(使用XSLT)進行排序,並將結果作爲XML返回。我知道這可能並不難,但這是我第一次使用XSLT的經歷,它給我帶來了一些麻煩。這裏的XML:使用XSLT對基於幾個子元素的XML排序

<root> 
    <subject> 
    <courseSubjectHeader> 
     <subjectCode>B</subjectCode> 
     <subjectName>text</subjectName> 
     <unit>text</unit> 
     <faculty>text</faculty> 
    </courseSubjectHeader> 
    <course> 
     <crsLevel>text</crsLevel> 
     <subjectAndNumber>B 200</subjectAndNumber> 
     <units>3.0</units> 
     <hours>3-0</hours> 
    </course> 
    <course> 
     <crsLevel>text</crsLevel> 
     <subjectAndNumber>B 100</subjectAndNumber> 
     <units>3.0</units> 
     <hours>3-0</hours> 
    </course> 
    </subject> 
    <subject> 
    <courseSubjectHeader> 
     <subjectCode>C</subjectCode> 
     <subjectName>text</subjectName> 
     <unit>text</unit> 
     <faculty>text</faculty> 
    </courseSubjectHeader> 
    <course> 
     <crsLevel>text</crsLevel> 
     <subjectAndNumber>C 300</subjectAndNumber> 
     <units>3.0</units> 
     <hours>3-0</hours> 
    </course> 
    <course> 
     <crsLevel>text</crsLevel> 
     <subjectAndNumber>C 100</subjectAndNumber> 
     <units>3.0</units> 
     <hours>3-0</hours> 
    </course> 
    </subject> 
    <subject> 
    <courseSubjectHeader> 
     <subjectCode>A</subjectCode> 
     <subjectName>text</subjectName> 
     <unit>text</unit> 
     <faculty>text</faculty> 
    </courseSubjectHeader> 
    <course> 
     <crsLevel>text</crsLevel> 
     <subjectAndNumber>A 300</subjectAndNumber> 
     <units>3.0</units> 
     <hours>3-0</hours> 
    </course> 
    <course> 
     <crsLevel>text</crsLevel> 
     <subjectAndNumber>A 200</subjectAndNumber> 
     <units>3.0</units> 
     <hours>3-0</hours> 
    </course> 
    </subject> 
</root> 

我想用自己的「subjectCode」子元素的「主體」進行排序,並通過他們的「subjectAndNumber」子元素每個主題內的所有課程。因此生成的XML將是...

<root> 
    <subject> 
    <courseSubjectHeader> 
     <subjectCode>A</subjectCode> 
     <subjectName>text</subjectName> 
     <unit>text</unit> 
     <faculty>text</faculty> 
    </courseSubjectHeader> 
    <course> 
     <crsLevel>text</crsLevel> 
     <subjectAndNumber>A 200</subjectAndNumber> 
     <units>3.0</units> 
     <hours>3-0</hours> 
    </course> 
    <course> 
     <crsLevel>text</crsLevel> 
     <subjectAndNumber>A 300</subjectAndNumber> 
     <units>3.0</units> 
     <hours>3-0</hours> 
    </course> 
    </subject> 
    <subject> 
    <courseSubjectHeader> 
     <subjectCode>B</subjectCode> 
     <subjectName>text</subjectName> 
     <unit>text</unit> 
     <faculty>text</faculty> 
    </courseSubjectHeader> 
    <course> 
     <crsLevel>text</crsLevel> 
     <subjectAndNumber>B 100</subjectAndNumber> 
     <units>3.0</units> 
     <hours>3-0</hours> 
    </course> 
    <course> 
     <crsLevel>text</crsLevel> 
     <subjectAndNumber>B 200</subjectAndNumber> 
     <units>3.0</units> 
     <hours>3-0</hours> 
    </course> 
    </subject> 
    <subject> 
    <courseSubjectHeader> 
     <subjectCode>C</subjectCode> 
     <subjectName>text</subjectName> 
     <unit>text</unit> 
     <faculty>text</faculty> 
    </courseSubjectHeader> 
    <course> 
     <crsLevel>text</crsLevel> 
     <subjectAndNumber>C 100</subjectAndNumber> 
     <units>3.0</units> 
     <hours>3-0</hours> 
    </course> 
    <course> 
     <crsLevel>text</crsLevel> 
     <subjectAndNumber>C 300</subjectAndNumber> 
     <units>3.0</units> 
     <hours>3-0</hours> 
    </course> 
    </subject> 
</root> 

最後,這裏是我的(很可怕)嘗試在XSLT:

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

    <xsl:output method="xml" indent="yes"/> 
    <xsl:strip-space elements="*"/> 

    <xsl:template match="@*|node()"> 
     <xsl:copy> 
      <xsl:apply-templates select="@*|node()"/> 
     </xsl:copy> 
    </xsl:template> 

    <xsl:template match="/"> 
     <xsl:copy> 
      <xsl:apply-templates select="subject"> 
       <xsl:sort select="subjectCode"/> 
      </xsl:apply-templates> 
     </xsl:copy> 
    </xsl:template> 

    <xsl:template match="subject"> 
     <xsl:copy> 
      <xsl:apply-templates select="course"> 
       <xsl:sort select="subjectAndNumber"/> 
      </xsl:apply-templates> 
     </xsl:copy> 
    </xsl:template> 

</xsl:stylesheet> 

任何幫助,將不勝感激,謝謝!

回答

2

你只有幾個小錯誤 - 比較:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="xml" indent="yes"/> 
<xsl:strip-space elements="*"/> 

<xsl:template match="@*|node()"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*|node()"/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="/*"> 
    <xsl:copy> 
     <xsl:apply-templates select="subject"> 
      <xsl:sort select="courseSubjectHeader/subjectCode"/> 
     </xsl:apply-templates> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="subject"> 
    <xsl:copy> 
     <xsl:copy-of select="courseSubjectHeader"/> 
     <xsl:apply-templates select="course"> 
      <xsl:sort select="subjectAndNumber"/> 
     </xsl:apply-templates> 
    </xsl:copy> 
</xsl:template> 

</xsl:stylesheet> 

注意:您最嚴重的錯誤是這樣的:xmlns:xsl="http://www.w3.org/1999/ /Transform"。如果您沒有正確聲明XSLT名稱空間,那麼您的文檔根本就不是樣式表。

+0

啊,這是我的錯誤,我必須在堆棧編輯器中編輯它時添加了該空間。非常感謝,這看起來很完美! – user3717031