在xslt中的元素下对相同标记进行分组

时间:2012-05-31 05:55:45

标签: xslt xpath xslt-1.0

我正在使用XSLT,源代码如下所示。

来源:

        <Data>
             <AB>all</AB>
             <AB>all2</AB>
             <CD>hhhhhh</CD>
             <DE>hhhshhh</DE>                
        </Data>

需要编写XSLT以获取输出

   <Info>
        <XXX>
        <TTT value="all"/>
        <TTT value="all2"/>
        </XXX>
    <!--    ....-->
    <!--    ..to het all the elements..   -->

   </Info>

我必须编写xslt来匹配标记。

    <xsl:template match="AB">


    </xsl:template>

我可以通过匹配数据标记来实现。

    <?xml version="1.0" encoding="utf-8"?>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
        <xsl:output method="xml" indent="yes"/>

         <xsl:template match="Data">
        <info>
          <XXX>
          <xsl:for-each select="AB">
          <TTT>
          <xsl:attribute name="value">
            <xsl:value-of select="."/>
          </xsl:attribute>
          </TTT>
          </xsl:for-each>
          </XXX>
        </info>
          </xsl:template>

    </xsl:stylesheet>

任何人都可以通过匹配AB标记

来帮助我解决这个问题
    <xsl:template match="AB">


    </xsl:template>

谢谢。

1 个答案:

答案 0 :(得分:0)

我想你问的是如何使用 xsl:apply-templates 。如果是这样,您的XSLT将如下所示

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
   <xsl:output method="xml" indent="yes"/>

   <xsl:template match="Data">
      <info>
         <XXX>
            <xsl:apply-templates select="AB"/>
         </XXX>
      </info>
   </xsl:template>

   <xsl:template match="AB">
      <TTT value="{.}"/>
   </xsl:template>
</xsl:stylesheet>

还要注意在 AB 模板中使用属性值模板来简化XSLT。

如果您还要求其他非AB元素输出不变,您可以在XSLT中使用身份转换

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
   <xsl:output method="xml" indent="yes"/>

   <xsl:template match="Data">
      <info>
         <XXX>
            <xsl:apply-templates select="AB"/>
         </XXX>
         <xsl:apply-templates select="node()[not(self::AB)]" />
      </info>
   </xsl:template>
   <xsl:template match="AB">
      <TTT value="{.}"/>
   </xsl:template>

    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>   
</xsl:stylesheet>

这也将匹配所有非AB元素,在XXX元素后面输出。在您的情况下,它将输出以下内容:

<info>
   <XXX>
      <TTT value="all" />
      <TTT value="all2" />
    </XXX>
    <CD>hhhhhh</CD>
    <DE>hhhshhh</DE>
</info>

当然,没有理由不能让其他模板匹配像CD或DE这样的元素来转换它们。