1

我有这个 xml 作为我的输入:

        <unidad num="2.">
               <tag></tag>
               <tag2></tag2>
       <unidad num="2.1">
                  <tag></tag>
                  <tag2></tag2>          
                  <unidad num="2.1.1">
                     <tag></tag>
                     <tag2></tag2>  
                     <unidad num="2.1.1.1">
                        <tag></tag>
                        <tag2></tag2>   
                     </unidad>
                  </unidad>
               </unidad>
            </unidad>

我的输出应该是:

        <sub>
               <tag></tag>
               <tag2></tag2>
       <sub2>
                  <tag></tag>
                  <tag2></tag2>          
                  <sub3>
                     <tag></tag>
                     <tag2></tag2>  
                     <sub4>
                        <tag></tag>
                        <tag2></tag2>   
                     </sub4>
                  </sub3>
               </sub2>
            </sub>

我找不到正确的方法来做到这一点。我正在使用模板,我有这个:

  <xsl:for-each select="unidad">
        <xsl:call-template name="unidades1"/>
  </xsl:for-each>

      <xsl:template name="unidades1">
    <xsl:element name="sub1">
        <xsl:text></xsl:text>
            </xsl:element>
           <xsl:if test="position() != last()">
        <xsl:apply-templates select="child::*"/>
    </xsl:if>
       </xsl:template>

       <xsl:template match="unidad">
           <xsl:call-template name="unidades2"/>
       </xsl:template>


      <xsl:template name="unidades2">
    <xsl:element name="sub2">
        <xsl:text></xsl:text>
            </xsl:element>
           <xsl:if test="position() != last()">
        <xsl:apply-templates select="child::*"/>
    </xsl:if>
       </xsl:template>

有了这个XSLT,unidad的每一个子元素都匹配第二个条件,所以写成sub2,不知道是不是另一个unidad元素的子元素。任何想法如何达到这个目标?谢谢!

4

1 回答 1

0

此样式表产生所需的输出。它使用经过修改的身份转换<unidad>和元素的专用模板。

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

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

    <xsl:template match="unidad">
<!--count the number of ancestors that are unidad elements-->
        <xsl:variable name="unidad-ancestor-count" select="count(ancestor::unidad)"/>

<!--If there are at least one unidad ancestors then 
    set the suffix to be the count()+1-->  
      <xsl:variable name="suffix">
            <xsl:if test="$unidad-ancestor-count>0">
                <xsl:value-of select="$unidad-ancestor-count+1"/>
            </xsl:if>
        </xsl:variable>

<!--create a new element using a base name of "sub" and the suffix value -->
        <xsl:element name="sub{$suffix}">
<!--not pushing the @num attribute through the identity template, 
    just descendant nodes-->
            <xsl:apply-templates /> 
        </xsl:element>
    </xsl:template>

</xsl:stylesheet>
于 2013-10-10T23:22:53.570 回答