XML в таблицу, как получить позицию () узла контекста для указанного предка (ей) - PullRequest
1 голос
/ 28 февраля 2009

У меня есть такой xml:

<A1>
  <B1>
    <C1>
    <C2>
    <C3>
  </B1>
  <B2>
    <C4>
    <C5>
    <C6>
  </B2>
</A1>
<A2>
  <B3>
    <C7>
    <C8>
    <C9>
  </B3>
  <B4>
    <C10>
    <C11>
    <C12>
  </B4>
</A2>

Мне нужно преобразовать его в таблицу с вложенными строками:

<table border="yes">
<tr>
  <td>A1</td>
  <td>B1</td>
  <td>C1</td>
</tr>
<tr>
  <td></td>
  <td></td>
  <td>C2</td>
</tr>
<tr>
 <td></td>
 <td></td>
 <td>C3</td>
</tr>
<tr>
 <td></td>
 <td>B2</td>
 <td>C3</td>
</tr>
<tr>
 <td></td>
 <td></td>
 <td>C4</td>
</tr>

A и B появляются, только если они новые (не повторяются в каждом ряду);

Я пытаюсь использовать position ()

<xsl:template match="c">
 <tr>
  <td>
   <xsl:if test="IT IS THE FIRST C IN A">
     <xsl:value-of select="ancestor::A"/>
   </xsl:if>
  </td>
  <td>
   <xsl:if test="position(1)">
   <xsl:value-of select="parent"/>
   </xsl:if>
  </td>
  <td>
    <xsl:value-of select="."/>
  </td>
 </tr>
</xsl:template>

Кажется, что мы должны эмулировать position () для предка. Существует ли общее решение для любого количества вложенных строк?

1 Ответ

2 голосов
/ 28 февраля 2009

Возможно, вам нужно что-то вроде следующего (если я правильно понял ваш вопрос):

<xsl:template match="C">
 <tr>
  <td>
   <xsl:if test="generate-id(ancestor::A/descendant::C[1]) = generate-id(.)">
     <xsl:value-of select="ancestor::A"/>
   </xsl:if>
  </td>
  <td>
   <xsl:if test="not(previous-sibling::C)">
     <xsl:value-of select=".."/>
   </xsl:if>
  </td>
  <td>
    <xsl:value-of select="."/>
  </td>
 </tr>
</xsl:template>

<xsl:template match="/">
  <xsl:apply-templates select="descendant::C"/>
</xsl:template>

Редактировать: вы также можете использовать

not(previous-sibling::C) and not(../previous-sibling::B)

в качестве первого теста (вместо использования generate-id()).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...