2012-03-19 53 views
-1

我正在尋找一種方法將此代碼輸出爲html。針對每個問題的XSLT

<legal> 
    <heading>Poo</heading> 
    <g>fart <a href="http://www.bclaws.ca/EPLibraries/bclaws_new/document/ID/freeside/96165_01">Freedom of Information and Protection of Privacy Act</a> (RSBC 1996 ch. 165):</g> 
    <foo> 
    <bar>a </bar> 
    <bar>b </bar> 
    <bar>c </bar> 
    <bar>d </bar> 
    <bar>e </bar> 
    <bar>f </bar> 
    </foo> 
    <g> faf </g> 
    <g> faf </g> 
    <g> faf </g> 
    <g> faf </g> 
    <g> faf </g> 
    <g> faf </g> 
    <g> faf </g> 
    <foo> 
     <bar> a </bar> 
     <bar> b </bar> 
     <bar> c </bar> 
    </foo> 
    <g> asfd </g> 
    <g> asfd </g> 
    <g> asfd </g> 
    <g> asfd </g> 
    <g> asfd </g> 
    <g> asfd </g> 
    <g> asfd </g> 
    <foo> 
     <bar> a </bar> 
     <bar> b </bar> 
     <bar> c </bar> 
    </foo> 
</legal> 

這裏是我的XSLT那麼遠,我似乎每個輸出和每個g元素不能在p標籤內......似乎只輸出一次,永遠不會再。另外,我似乎只輸出了同樣的東西兩次......我哪裏錯了?

<xsl:variable name="legal" select="document('legal.xml')/legal"/> 
    <xsl:for-each select="$legal/heading"> 
    <h3><xsl:value-of select="$legal/heading"/></h3> 
    <p><xsl:value-of select="$legal/g"/></p> 
     <ul> 
     <xsl:for-each select="$legal/foo/bar"> 
      <li><xsl:value-of select="."/></li> 
     </xsl:for-each> 
     </ul> 
    </xsl:for-each> 

回答

1

我建議更換你這個顯示的整個的代碼片段:

<xsl:apply-templates select="document('legal.xml')/legal" /> 

,並添加這些模板:

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

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

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

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

你得到dupli的原因cates現在是因爲你迭代每個頭,然後在該循​​環的每次迭代中,處理相同的g元素,並遍歷相同的foo元素,而不管它們之後的頭是什麼。在源代碼和html輸出中,g/p元素不是header/h3元素的子元素,因此在代碼中對待它們沒有任何意義。

+1

其實他並沒有遍歷所有'g'元素......他輸出第一個'g'元素的字符串值(這是'legal'的子元素)。 'value-of'只需要選擇第一個節點。假設XSLT 1.0。 – LarsH 2012-03-19 21:31:32

+0

啊,真的,但它仍然遍歷所有'foo'。 – Flynn1179 2012-03-19 22:16:49

1

你想要的東西像

<xsl:variable name="legal" select="document('legal.xml')/legal"/> 
<xsl:for-each select="$legal/heading"> 
<h3><xsl:value-of select="."/></h3> 
<xsl:for-each select="../g"><p><xsl:value-of select="."/></p></xsl:for-each> 
    <ul> 
    <xsl:for-each select="$legal/foo/bar"> 
     <li><xsl:value-of select="."/></li> 
    </xsl:for-each> 
    </ul> 
</xsl:for-each>