“将xml转换为具有太多未知数的html表”后续

问题描述:

这是帖子“Transforming xml into html table with too many unknowns” 的第2部分除了为每种语言创建具有不同行的html表之外,我还需要为每种语言不同的行包含来自descripGrp的信息。下面是从原始的XML文件中摘录1个descripGrp的语言“CS”“将xml转换为具有太多未知数的html表”后续

<mtf> 
    <conceptGrp> 
    <concept>1</concept> 

    <languageGrp> 
     <language lang="DE" type="Deutsch"/> 

     <termGrp> 
     <term>Abbildung</term> 
     </termGrp> 
    </languageGrp> 

    <languageGrp> 
     <language lang="PL" type="Polnisch"/> 

     <termGrp> 
     <term>ilustracja</term> 
     </termGrp> 
    </languageGrp> 

    <languageGrp> 
     <language lang="RU" type="Russisch"/> 

     <termGrp> 
     <term>иллюстрация</term> 
     </termGrp> 

     <termGrp> 
     <term>рисунок</term> 
     </termGrp> 
    </languageGrp> 

    <languageGrp> 
     <language lang="CS" type="Tschechisch"/> 

     <termGrp> 
     <term>vyobrazení</term> 

     <descripGrp> 
      <descrip type="Autor">MK</descrip> 
     </descripGrp> 
     </termGrp> 
    </languageGrp> 
    </conceptGrp> 
</mtf> 

的“descripGrp”可以有不同的“类型”和可能出现的每个“languageGrp/termGrP”或可能会丢失全部一起。感谢JLRishe为第一个问题提供了一个很好的答案,第一个问题就是答案,但这里提到的增加仍然是开放的。感谢您的输入。非常非常感谢。

这是我想出了:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" encoding="utf-8" indent="yes"/> 
    <xsl:key name="kLang" match="languageGrp" use="language/@lang" /> 
    <xsl:key name="kDescrip" match="descrip" 
      use="concat(../../../language/@lang, '+', @type)" /> 
    <xsl:variable name="uniqueLangs" 
       select="/mtf/conceptGrp/languageGrp 
        [generate-id() = generate-id(key('kLang', language/@lang)[1])]" /> 
    <!-- A set of the first item of each <descrip>, grouped by @lang and @type --> 
    <xsl:variable name="uniqueDescrip" 
       select="/mtf/conceptGrp/languageGrp/termGrp/descripGrp/descrip 
        [generate-id() = 
        generate-id(key('kDescrip', 
         concat(../../../language/@lang, '+', @type))[1])]" /> 

    <xsl:template match="mtf"> 
    <html> 
     <body> 
     <h2>Terminologie</h2> 
     <table> 
      <tr> 
      <!--Zeile 1--> 
      <td>Konzept-ID</td> 
      <xsl:apply-templates select="$uniqueLangs" mode="header"/> 
      </tr> 
      <xsl:apply-templates/> 
     </table> 
     </body> 
    </html> 
    </xsl:template> 


    <xsl:template match="conceptGrp"> 
    <xsl:apply-templates select="languageGrp" mode="maxGroup"> 
     <xsl:sort select="count(termGrp)" order="descending" data-type="number"/> 
    </xsl:apply-templates> 
    </xsl:template> 

    <xsl:template match="languageGrp" mode="header"> 
    <td> 
     <xsl:value-of select="language/@type"/> 
    </td> 
    <xsl:apply-templates 
      select="$uniqueDescrip[../../../language/@lang = 
          current()/language/@lang]" 
      mode="header" /> 
    </xsl:template> 

    <xsl:template match="descrip" mode="header"> 
    <td> 
     <xsl:value-of select="@type"/> 
    </td> 
    </xsl:template> 

    <xsl:template match="languageGrp" mode="maxGroup"> 
    <!-- Only use the first group out of the sorting (most termGrps) --> 
    <xsl:if test="position() = 1"> 
     <xsl:apply-templates select="termGrp" /> 
    </xsl:if> 
    </xsl:template> 

    <xsl:template match="termGrp"> 
    <tr> 
     <td> 
     <xsl:value-of select="../../concept"/> 
     </td> 
     <!-- Iterate through all of the distinct languages --> 
     <xsl:apply-templates select="$uniqueLangs" mode="item"> 
     <xsl:with-param name="currConcept" select="../.." /> 
     <xsl:with-param name="pos" select="position()" /> 
     </xsl:apply-templates> 
    </tr> 
    </xsl:template> 

    <xsl:template match="languageGrp" mode="item"> 
    <xsl:param name="currConcept" /> 
    <xsl:param name="pos" /> 

    <xsl:variable name="matchingTermGrp" 
        select="$currConcept/languageGrp[language/@lang = 
                current()/language/@lang] 
                /termGrp[$pos]" /> 
    <td> 
     <xsl:value-of select="$matchingTermGrp/term"/> 
    </td> 
    <xsl:apply-templates 
     select="$uniqueDescrip[../../../language/@lang = current()/language/@lang]" 
     mode="value"> 
     <xsl:with-param name="termGrp" select="$matchingTermGrp" /> 
    </xsl:apply-templates> 
    </xsl:template> 

    <xsl:template match="descrip" mode="value"> 
    <xsl:param name="termGrp" /> 
    <td> 
     <xsl:value-of select="$termGrp/descripGrp/descrip[@type = current()/@type]" /> 
    </td> 
    </xsl:template> 
</xsl:stylesheet> 

当在此输入XML运行:

<mtf> 
    <conceptGrp> 
    <concept>1</concept> 

    <languageGrp> 
     <language lang="DE" type="Deutsch"/> 

     <termGrp> 
     <term>Abbildung</term> 
     </termGrp> 
    </languageGrp> 

    <languageGrp> 
     <language lang="PL" type="Polnisch"/> 

     <termGrp> 
     <term>ilustracja</term> 
     </termGrp> 
    </languageGrp> 

    <languageGrp> 
     <language lang="RU" type="Russisch"/> 

     <termGrp> 
     <term>иллюстрация</term> 
     <descripGrp> 
      <descrip type="Other">Sales</descrip> 
     </descripGrp> 
     </termGrp> 

     <termGrp> 
     <term>рисунок</term> 
     <descripGrp> 
      <descrip type="Other">Marketing</descrip> 
     </descripGrp> 
     </termGrp> 
    </languageGrp> 

    <languageGrp> 
     <language lang="CS" type="Tschechisch"/> 

     <termGrp> 
     <term>vyobrazení</term> 

     <descripGrp> 
      <descrip type="Autor">MK</descrip> 
      <descrip type="Kontext">Marketing</descrip> 
     </descripGrp> 
     </termGrp> 
    </languageGrp> 
    </conceptGrp> 
</mtf> 

这将产生:

<html> 
    <body> 
    <h2>Terminologie</h2> 
    <table> 
     <tr> 
     <td>Konzept-ID</td> 
     <td>Deutsch</td> 
     <td>Polnisch</td> 
     <td>Russisch</td> 
     <td>Other</td> 
     <td>Tschechisch</td> 
     <td>Autor</td> 
     <td>Kontext</td> 
     </tr> 
     <tr> 
     <td>1</td> 
     <td>Abbildung</td> 
     <td>ilustracja</td> 
     <td>иллюстрация</td> 
     <td>Sales</td> 
     <td>vyobrazení</td> 
     <td>MK</td> 
     <td>Marketing</td> 
     </tr> 
     <tr> 
     <td>1</td> 
     <td></td> 
     <td></td> 
     <td>рисунок</td> 
     <td>Marketing</td> 
     <td></td> 
     <td></td> 
     <td></td> 
     </tr> 
    </table> 
    </body> 
</html> 
+0

我最深和无尽的感激之情。它完美的作品!这就是我需要的。非常感谢。我会做什么.... – user1633701 2013-02-13 14:36:20

+0

哈哈,很高兴帮助。请记住通过单击旁边的复选标记图标将答案标记为正确。谢谢! – JLRishe 2013-02-13 14:54:22