XSLT:如果它是父节点或子节点,如何更改标签名称?

时间:2013-10-10 22:17:05

标签: java xml xslt

我有这个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元素的子节点。任何想法如何达到这个?谢谢!

1 个答案:

答案 0 :(得分:0)

此样式表可生成所需的输出。它使用经过修改的identity transform,其中包含<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>