我对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元素。 (构建该字符串的结束节点,以便特定字符串可用作指向特定节,子节,段等的指针)。您可以将其视为内部链接或锚点。
我可以通过电子邮件向我发送当前获得的输出的虚拟数据。 非常感谢您的帮助。感谢。