1

我正在使用 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>

谢谢你。

4

1 回答 1

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 等元素来转换它们。

于 2012-05-31T06:30:07.910 回答