XSLT在复制的部分之间插入元素

时间:2013-03-12 13:29:04

标签: xml xslt-1.0

我对xslt很新。 我正在使用xslt 1.0。 我有一个xml文档,其结构不确定,并随每个部分而变化:

<section label="">
 <subsection label="">
  <para label="">
   <subpara label=""></subpara>
   <subpara label=""></subpara>
  </para>
 </subsection>
</section>
<section label="">
 <subsection label="">

 </subsection>
</section>
<section label="">
 <subsection label="">
   <para label="">

   </para>
 </subsection>
</section>

然后我遍历每个部分的循环,构建一个带有每个节点标签值的字符串,然后使用递归方法复制每个节节点,子节点和属性以及文本。

 <xsl:template match="/">
 <xsl:for-each select="//section">
   <xsl:variable name="section">
     <xsl:value-of select="@label"/>
   </xsl:variable>
      <xsl:if test=".//subSection">
        <xsl:for-each select=".//subSection">
          <xsl:variable name="subsection">
            <xsl:if test="string-length(./@label) > '0'">
              (<xsl:value-of select="@label"/>)
            </xsl:if>
          </xsl:variable>

          <xsl:if test=".//para">
            <xsl:for-each select=".//para">
              <xsl:variable name="para">
                <xsl:if test="string-length(./@label) > '0'">
                  (<xsl:value-of select="@label"/>)
                </xsl:if>
              </xsl:variable>

              <xsl:if test=".//subPara">
                <xsl:for-each select=".//subPara">
                  <xsl:variable name="subpara">
                    <xsl:if test="string-length(./@label) > '0'">
                      (<xsl:value-of select="@label"/>)
                    </xsl:if>
                  </xsl:variable>
                  <xsl:if test=".//item">
                    <xsl:for-each select=".//item">
                      <xsl:variable name="item">
                        <xsl:if test="string-length(./@label) > '0'">
                          (<xsl:value-of select="@label"/>)
                        </xsl:if>
                      </xsl:variable>
                      <xmlstringtobuild name="{concat('XML_',$act,' s ',$section,$subsection,$para,$subpara,$item)}"/>
                    </xsl:for-each>
                  </xsl:if>
                  <xmlstringtobuild name="{concat('XML_',$act,' s ',$section,$subsection,$para,$subpara)}"/>
                </xsl:for-each>
              </xsl:if>
              <xmlstringtobuild name="{concat('XML_',$act,' s       ',$section,$subsection,$para)}"/>
            </xsl:for-each>
          </xsl:if>
          <xsl:if test="string-length(@label) > '0'">
            <xmlstringtobuild name="{concat('XML_',$act,' s ',$section,$subsection)}"/>
          </xsl:if>
        </xsl:for-each>
      </xsl:if>
      <xmlstringtobuild name="{concat('XML_',$act,' s ',$section)}"/>
      <xsl:call-template name="LNRecurseToRoot">
        <xsl:with-param name="parent" select="parent::*"/>
        <xsl:with-param name="current">
          <xsl:apply-templates select="." mode="lmt"/>
        </xsl:with-param>
      </xsl:call-template>
 </xsl:for-each>
</xsl:template>

<xsl:template name="LNRecurseToRoot">
<xsl:param name="parent"/>
<xsl:param name="current"/>
<xsl:choose>
  <xsl:when test="not($parent)">
    <xsl:copy-of select="$current"/>
   </xsl:when>
  <xsl:otherwise>
    <xsl:call-template name="LNRecurseToRoot">
      <xsl:with-param name="parent" select="$parent/parent::*"/>
      <xsl:with-param name="current">
        <xsl:for-each select="$parent">
            <xsl:copy>
            <!-- make sure all attributes go across too -->
            <xsl:for-each select="./@*">
              <xsl:copy/>
            </xsl:for-each>
            <!-- add in children along the axis -->
            <xsl:copy-of select="$current"/>
          </xsl:copy>
        </xsl:for-each>
      </xsl:with-param>
    </xsl:call-template>
  </xsl:otherwise>
</xsl:choose>
</xsl:template> 

我的问题是我想在递归复制输出中的正确位置插入xmlstringtobuild元素。 (构建该字符串的结束节点,以便特定字符串可用作指向特定节,子节,段等的指针)。您可以将其视为内部链接或锚点。

我可以通过电子邮件向我发送当前获得的输出的虚拟数据。 非常感谢您的帮助。感谢。

0 个答案:

没有答案