2012-03-19 52 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>