XSLT for-each问题

时间:2012-03-19 20:05:00

标签: xml xslt

我正在寻找一种将此代码输出为html的方法。

<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>

2 个答案:

答案 0 :(得分: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>

答案 1 :(得分: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>

您此刻获得重复的原因是因为您在每个标头上进行迭代,然后在该循​​环的每次迭代中,您正在处理相同的g元素,并在其上进行迭代foo元素,无论他们追求的是哪个标题。在您的源代码和html输出中,g / p元素不是header / h3元素的子元素,因此将它们视为处理它们是没有意义的你的代码。