Как создать HTML-таблицу из атрибутов элементов XML и тегов XML с помощью xslt - PullRequest
0 голосов
/ 08 декабря 2011

Я действительно новичок в xslt, поэтому я был бы очень благодарен, если бы кто-нибудь смог мне помочь ... У меня есть XML, как это:

        <dummy>
        <element name="O">
            <description/>
        </element>
        <element name="L">
            <description>abstract for L</description>
        </element>
        <element name="Sd">
            <description>Description for Sd</description>
        </element>
        <element name="Dh">
            <description/>
        </element>
        <element name="P">
            <description/>
        </element>
        <element name="S">
            <description>Some description for S</description>
        </element>
        <element name="A">
            <description/>
        </element>
        <L>2010</L>
        <A>58.78</A>
        <O>O</O>
        <Sd>1101</Sd>
        <S>0.00</S>
        <A>368.38</A>
        <L>2009</L>
        <Sd>1103</Sd>
    </dummy>

У меня должна быть окончательная HTML-таблица, подобная этой (с использованием xslt "1.0"):

            <tr>
    <td>
        I have to select only non element tags one by one, and then replace the tag with the 
        description of the same element name (in case that decription does not exists then display only element name). 
    </td>
    <td>
        Value of non element tag
    </td>
    </tr>


4 example ( upper xml) 
    [in something like for-each]:  take  <L> 2010 </L>  

тогда ищите элемент name = "L" (если описание существует = true take описание остальное "L") и показать реферат для L 2010

Таким образом, конечный результат 4 с учетом xml должен быть:

    <tr><td> abstract for L  </td> <td> 2010 </td> </tr>
    <tr><td> A  </td> <td> 58.78 </td> </tr>
    <tr><td> O  </td> <td> O </td> </tr>
    <tr><td> Description for Sd </td> <td> 1101 </td> </tr>
    <tr><td> Some description for S  </td> <td> 0.00 </td> </tr>
    <tr><td> A  </td> <td> 368.38 </td> </tr>
    <tr><td> abstract for L  </td> <td> 2009</td> </tr>
    <tr><td> Description for Sd </td> <td> 1103 </td> </tr>

xslt должен быть записан в xslt = "1.0"

Ответы [ 2 ]

0 голосов
/ 09 декабря 2011

Я думаю, что вы могли бы использовать ключ здесь для поиска ваших элементов узлов по атрибуту name

<xsl:key name="elements" match="element" use="@name" />

Во-первых, вам нужно будет сопоставить все ваши не элементы узлы, например

<xsl:apply-templates select="dummy/*[not(self::element)]" />

Затем, чтобы найти описание соответствующего элемент вы можете использовать ключ, установленный ранее

<xsl:apply-templates select="key('elements', local-name())"/>

В этом случае у вас будет два соответствующих шаблона для узлов element ;один для элемента узлов с описанием , и один для тех без.

Вот полный XSLT

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
   <xsl:output method="html" indent="yes"/>
   <xsl:key name="elements" match="element" use="@name"/>

   <xsl:template match="/">
      <table>
         <xsl:apply-templates select="dummy/*[not(self::element)]"/>
      </table>
   </xsl:template>

   <xsl:template match="*[not(self::element)]">
      <tr>
         <td>
            <xsl:apply-templates select="key('elements', local-name())"/>
         </td>
         <td>
            <xsl:value-of select="."/>
         </td>
      </tr>
   </xsl:template>

   <xsl:template match="element">
      <xsl:value-of select="@name"/>
   </xsl:template>

   <xsl:template match="element[description[node()]]">
      <xsl:value-of select="description"/>
   </xsl:template>
</xsl:stylesheet>

Применительно к вашемуВ примере XML выводится следующий HTML-код:

<table>
   <tr>
      <td>abstract for L</td>
      <td>2010</td>
   </tr>
   <tr>
      <td>A</td>
      <td>58.78</td>
   </tr>
   <tr>
      <td>O</td>
      <td>O</td>
   </tr>
   <tr>
      <td>Description for Sd</td>
      <td>1101</td>
   </tr>
   <tr>
      <td>Some description for S</td>
      <td>0.00</td>
   </tr>
   <tr>
      <td>A</td>
      <td>368.38</td>
   </tr>
   <tr>
      <td>abstract for L</td>
      <td>2009</td>
   </tr>
   <tr>
      <td>Description for Sd</td>
      <td>1103</td>
   </tr>
</table>
0 голосов
/ 09 декабря 2011

Включает выбор именованных элементов 'letter', используя name() в предикате:

<xsl:template match="element">
    <xsl:param name='name' select="@name" />
    <td><xsl:value-of select="description" /></td>
    <td><xsl:value-of select="//*[name() = $name]" /></td>
</xsl:template>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...