2012-08-06 62 views
0

這是我的XML:XSL每個不同的節點XML文件

<?xml version="1.0" encoding="UTF-8"?> 
<?xml-stylesheet type="text/xsl" href="coursestyle.xsl"?> 
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"> 
    <s:Body> 
     <ns0:FindCoursesForOffenderResponse xmlns:ns0="http://H.FindCoursesForOffenderResponse"> 
     <ns0:SiteList> 
      <ns0:SiteEntity> 
       <ns0:SiteId>10</ns0:SiteId> 
       <ns0:SiteName>Ramada Watford</ns0:SiteName> 
      </ns0:SiteEntity> 
      <ns0:SiteEntity> 
       <ns0:SiteId>20</ns0:SiteId> 
       <ns0:SiteName>Ramada Jarvis (Comet) Hotel</ns0:SiteName> 
      </ns0:SiteEntity> 
     </ns0:SiteList> 
     <ns0:CourseList> 
      <ns0:CourseEntity> 
       <ns0:CourseId>50</ns0:CourseId> 
       <ns0:SiteId>10</ns0:SiteId> 
      </ns0:CourseEntity> 
      <ns0:CourseEntity> 
       <ns0:CourseId>10</ns0:CourseId> 
       <ns0:SiteId>10</ns0:SiteId> 
      </ns0:CourseEntity> 
      <ns0:CourseEntity> 
       <ns0:CourseId>20</ns0:CourseId> 
       <ns0:SiteId>20</ns0:SiteId> 
      </ns0:CourseEntity> 
     </ns0:CourseList> 
     </ns0:FindCoursesForOffenderResponse> 
    </s:Body> 
</s:Envelope> 

我想選擇SiteName每個CourseEntity。例如對於CourseID = 50SiteName應該是Ramada Watford

到目前爲止,我有這個XSL,但它不工作。

<?xml version='1.0'?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:ns0="http://H.FindCoursesForOffenderResponse" xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"> 
<xsl:output method="html"/> 
<xsl:param name="lnum">123</xsl:param> 

<xsl:template match="/"> 
    <html> 
    <body> 
    <ul> 

    <xsl:for-each select="s:Envelope/s:Body/ns0:FindCoursesForOffenderResponse/ns0:CourseList/ns0:CourseEntity"> 
     <xsl:variable name="currEntity"><xsl:value-of select="ns0:SiteId"/></xsl:variable> 
      <xsl:value-of select="$currEntity"/><br/> 
      <xsl:for-each select="s:Envelope/s:Body/ns0:FindCoursesForOffenderResponse/ns0:SiteList/ns0:SiteEntity[ns0:SiteId=$currEntity]">    
      <li> 
      <xsl:value-of select="ns0:SiteName"/> 

      </li> 
       </xsl:for-each> 
      </xsl:for-each> 

    </ul> 
    </body> 
    </html> 
</xsl:template> 
</xsl:stylesheet> 

第一for-each遍歷CourseEntities運行,內循環試圖找到每個課程ID相關的網站名稱。

有什麼想法?

輸出

<couseID> - <sitename> 
50 - Ramada Watford 
20 - Ramada Jarvis (Comet) Hotel 
+0

Runnable的演示你想要什麼輸出?請編輯顯示的問題。 – Utkanos 2012-08-06 11:03:33

+0

輸出添加:) – 2012-08-06 11:12:44

回答

3

的for-each在XSLT通常最好避免環路。試試這個模板化的方法。

this XMLPlayground

<!-- kick things off --> 
<xsl:template match="s:Envelope/s:Body/ns0:FindCoursesForOffenderResponse"> 
    <ul> 
     <xsl:apply-templates select='ns0:CourseList/ns0:CourseEntity' /> 
    </ul> 
</xsl:template> 

<!-- site entities... --> 
<xsl:template match='ns0:CourseEntity'> 
    <li> 
     <xsl:value-of select='ns0:CourseId' /> 
     - 
     <!-- ...find corresponding site name --> 
     <xsl:value-of select='../../ns0:SiteList/ns0:SiteEntity[ns0:SiteId = current()/ns0:SiteId]/ns0:SiteName' /> 
    </li> 
</xsl:template> 
+0

非常感謝答案Utkanos。有效。我不知道它是如何工作的。 :( – 2012-08-06 11:38:42

+2

很多人陷入的for-each時,他們開始XSL,因爲這是他們來自於其他語言的內容。XSLT的工作方式不同,需要不同的思維方式,從本質上講我在做什麼有應用模板( XSLT的關鍵概念)某些節點 - 即通過特定的轉換運行他們,我再看看樹,回裏面找到相應的站點名稱XSLT可能需要一段時間才能輪得到你的頭,但它很容易最終。 :) – Utkanos 2012-08-06 11:43:05

+0

非常感謝Utkanos。你是一個拯救生命的人! – 2012-08-06 12:00:37

相關問題