0

私は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要素を挿入したいということです。(特定の文字列を特定のセクション、サブセクション、パラなどへのポインターとして使用できるように、その文字列が作成されたエンドノード)。あなたはそれを内部リンクまたはアンカーと考えることができます。

現在取得している出力のダミーデータを誰かに電子メールで送信できます。どうぞよろしくお願いいたします。ありがとう。

4

0 に答える 0