XSLT для каждой проблемы - PullRequest
0 голосов
/ 20 марта 2012

Я ищу способ вывода этого кода в виде 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 ]

1 голос
/ 20 марта 2012

Я бы предложил заменить весь фрагмент кода, который вы показали, следующим:

<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, поэтому не имеет смысла рассматривать их как таковые в вашем коде.

1 голос
/ 20 марта 2012

Вы хотите что-то вроде

<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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...