私はxsltにかなり慣れていません。xslt1.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要素を挿入したいということです。(特定の文字列を特定のセクション、サブセクション、パラなどへのポインターとして使用できるように、その文字列が作成されたエンドノード)。あなたはそれを内部リンクまたはアンカーと考えることができます。
現在取得している出力のダミーデータを誰かに電子メールで送信できます。どうぞよろしくお願いいたします。ありがとう。