2013-08-20 63 views
0

我有一個XML文件,它具有許多類似命名的節點,但某些節點中的屬性是唯一的。我只想輸出到HTML頁面中的屬於某個屬性值的節點。xslt 1.0 - 嘗試獲取特定值的節點

這裏是XML:

<document> 
    <component> 
    <section> 
     <templateId value="temp_1" /> 
     <entry> 
     <act> 
      <code displayName="temp_1:code_1" /> 
     </act> 
     </entry> 
     <entry> 
     <act> 
      <code displayName="temp_1:code_2" /> 
     </act> 
     </entry> 
     <entry> 
     <act> 
      <code displayName="temp_1:code_3" /> 
     </act> 
     </entry> 
    </section> 
    <section> 
     <templateId value="temp_2" /> 
     <entry> 
     <act> 
      <code displayName="temp_2:code_1" /> 
     </act> 
     </entry> 
     <entry> 
     <act> 
      <code displayName="temp_2:code_2" /> 
     </act> 
     </entry> 
    </section> 
    </component> 
</document> 

從這個具體的例子,我想只能從有temp_2的templateId值的部分DisplayName值。這是我正在使用的XSL代碼,但它獲取了所有內容,而不僅僅是我想要的部分。我知道第一個「何時」正在工作,因爲正確的標題(跨度標記之間)正常顯示。這只是爲了每個參賽作品。

<xsl:tempalte match="/"> 
<xsl:choose> 
    <xsl:when test="//templateId/@value='temp_2'"> 
    <div style="margin-bottom: 5px; padding: 5px; border-bottom: 1px solid #000000;"> 
     <span style="font-weight: bold;">Template 2: </span> 
     <br /> 
     <xsl:choose> 
     <xsl:when test="count(//section/entry) != 0"> 
      <xsl:for-each select="//section/entry"> 
      <xsl:choose> 
       <xsl:when test="position() = 1"> 
       <xsl:value-of select="act/code/@displayName" /> 
       </xsl:when> 
       <xsl:otherwise> 
       <br/> 
       <xsl:value-of select="act/code/@displayName" /> 
       </xsl:otherwise> 
      </xsl:choose> 
      </xsl:for-each> 
     </xsl:when> 
     <xsl:otherwise> 
      No codes to display 
     </xsl:otherwise> 
     </xsl:choose> 
    </div> 
    </xsl:when> 
</xsl:choose> 
</xsl:template> 

它應該顯示像這樣:

temp_2:code_1 
<br>temp_2:code_2 

任何幫助將不勝感激。

+0

這將有助於查看您期望收到的輸出。 – ABach

+0

@ABach - 增加什麼輸出應該是 – jjasper0729

回答

0

根據你的描述,這聽起來像你只想要for-each中的temp_2值。

既然如此你可以更新你選擇以下:

<xsl:for-each select="//section[templateId/@value = 'temp_2']/entry"> 

此說抓住任何entrysection具有templateId帶有等於「temp_2」的value的屬性。

+0

我是否也會把這個在when語句正上方for-each我檢查計數以查看是否有條目?我需要檢查是否有任何條目,如果不是,請在其他位置顯示文本。 – jjasper0729

+0

是的,你可以。否則,您的測試時間是查看您所有的部分/條目而不是temp_2中的特定部分。 –

+0

現在就與這個一起...努力解釋torazaburo的其他答案,以便於長期使用。謝謝 – jjasper0729

1

我想你想完全重新研究XSLT及其哲學。不要將它編程爲BASIC。至少在你的情況下,基本模式是XSLT程序是處理匹配元素的模板集合。用ifchoose亂丟代碼,而不是用適當的匹配條件編寫模板。代替BASIC的FOR I=1 TO 10,使用<xsl:apply-templates/>來「遍歷」子代。這裏的基本思想是:

<xsl:template match="/"> 
    <html> 
     <xsl:apply-templates/> 
    </html> 
</xsl:template> 

<xsl:template match="templateId"/> <!-- skip templateID elements by default --> 

<xsl:template match="templateId[@value='temp_2']"> 
    <div style="margin-bottom: 5px; padding: 5px; border-bottom: 1px solid #000000;">   
     <span style="font-weight: bold;">Template 2: </span> 
     <xsl:apply-templates/> 
    </div> 
</xsl:template> 

<xsl:template match="code"> 
    <xsl:value-of select="@displayName"/> 
    <xsl:if test="position() != 1"><br/></xsl:if> 
</xsl:template> 

<xsl:template match="section[count(entry)=0]"> 
    No codes to display 
</xsl:template> 

爲什麼爲act元素沒有模板?那麼,默認情況下,XSLT將爲您提供一個模板,它可以執行<xsl:apply-templates/>

+0

我只是從vb.net背景進入XSLT,所以我的想法是在.net進程中。如果我想輸出模板1,但如果與模板2中的模板佈局不同,這將如何工作? – jjasper0729

+0

所以我應該有每種不同類型的輸出爲不同的節點(不只是在這個例子中的這些,因爲它是一個很大的xml文件的片段)一個模板,滿足需求,並通過XML文檔節點集下工作?您擁有的,它經歷了所有的「從...調用?它可以是特定的,以便不同的部分可以有自己的模板?如果這樣更容易閱讀,那麼這對我更有幫助。 – jjasper0729

+0

添加另一個模板' 2013-08-20 18:09:31