0

私は XSLT の初心者なので、支援を求めています。私はいくつかの XML ドキュメントを持っていますが、その代表的な例を次に示します。ドキュメントは<sub-doc(n)>要素に分割され、さらに要素に分割され<section>ます。セクション内には、0 個以上の<heading>要素、および 1 個以上の<paragraph>要素があります。<heading>私の目標は、複数の見出しを持つセクションを、それぞれに 1 つの見出しを持つ複数のセクションに分割することによって、すべてのセクションに多くても 1 つの要素しか持たないようにすることです。これが完了すると、 have<paragraph>の直後の要素は、 newに移動する必要があります。たとえば、次の例では、最初の ofに 2 つの要素があることに注意してください。私はこれを破る必要があります<heading><heading><section><section><sub-doc1><heading><section>要素を 2つの要素に分割し<section>、それぞれに独自の要素<heading>とフォローアップ<paragraph>要素を追加します。

<document>
 <sub-doc1>
  <section> <!-- This section needs to be split -->
   <heading>Subdoc1 first heading text</heading>
   <paragraph>A lot of text</paragraph>
   <paragraph>Yet more text</paragraph>
   <paragraph>More text</paragraph>
   ...
   <heading>Subdoc1 second heading text</heading>
   <paragraph>Even more text</paragraph>
   <paragraph>Some text</paragraph>
   ...
  </section>
  <section>
   <paragraph>Even more text</paragraph>
   ...
  </section>
 </sub-doc1>
 <sub-doc2>
  <section>
   <heading>Subdoc2, first heading text</heading>
   <paragraph>A lot of text here</paragraph>
   <paragraph>Yet more text here</paragraph>
   <paragraph>Yet more text here</paragraph>
   ...
  </section>
 </sub-doc2>
</document>  

つまり、変換されたドキュメントは次のようになる必要があります。

<document>
 <sub-doc1>
  <section> <!-- This section got split into two sections -->
   <heading>Subdoc1 first heading text</heading>
   <paragraph>A lot of text</paragraph>
   <paragraph>Yet more text</paragraph>
   <paragraph>More text</paragraph>
   ...
  </section>
  <section> <!-- This is a new section -->
   <heading>Subdoc1 second heading text</heading>
   <paragraph>Even more text</paragraph>
   <paragraph>Some text</paragraph>
   ...
  </section>
  <section>
   <paragraph>Even more text</paragraph>
   ...
  </section>
 </sub-doc1>
 <sub-doc2>
  <section>
   <heading>Subdoc2, first heading text</heading>
   <paragraph>A lot of text here</paragraph>
   <paragraph>Yet more text here</paragraph>
   <paragraph>Yet more text here</paragraph>
   ...
  </section>
 </sub-doc2>
</document>  

<heading>一部のセクションには要素がまったくないことに注意してください。そのような場合、それらのセクションは同じままにする必要があります。また、一部のセクションには単一の<heading>. これらのセクションも同じままにする必要があります。そして、ドキュメント内の他のすべては同じままである必要があります。発生する必要がある唯一の変換は<section>、ドキュメント内の任意の場所に複数の がある場合<heading>です。

繰り返しますが、私は XSLT を初めて使用するので、タスクを達成する XSL について理解できません。ご協力ありがとうございます。

4

2 に答える 2

-1

あなたが探している出力を生成することができます。このタイプの処理では、XPath で preceeding-sibling を使用して、探しているグループ要素を別の要素セットの間に存在する場合に取得する必要がありました。

ヘッダーのないセクションもいくつかあったため、それらのセクションを別の方法で処理する必要がありました。

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
  <xsl:template match="document">
    <document>
      <!-- Select the sub-doc elements and print their names, then process their children -->
      <xsl:for-each select="*">
        <xsl:element name="{local-name(.)}">
          <xsl:for-each select="section">
            <!-- For a section with 1 or more headings -->
            <xsl:choose>
              <xsl:when test="count(heading) &gt; 0">
                <!-- Print each section, heading and the paragraphs that follow -->
                <xsl:for-each select="heading">
                  <xsl:variable name="currentHeading" select="current()"/>
                  <section>
                    <heading>
                      <xsl:value-of select="."/>
                    </heading>
                    <!-- Pick paragraphs that follow current heading -->
                    <xsl:variable name="paragraphList" select="../paragraph[preceding-sibling::heading[1] = $currentHeading]"/>
                    <xsl:for-each select="$paragraphList">
                      <paragraph>
                        <xsl:value-of select="."/>
                      </paragraph>
                    </xsl:for-each>
                  </section>
                </xsl:for-each>
              </xsl:when>
              <xsl:otherwise>
                <section>
                  <xsl:for-each select="paragraph">
                    <paragraph>
                      <xsl:value-of select="."/>
                    </paragraph>
                  </xsl:for-each>
                </section>
              </xsl:otherwise>
            </xsl:choose>
          </xsl:for-each>
        </xsl:element>
      </xsl:for-each>
    </document>
  </xsl:template>
</xsl:stylesheet>

ニラジ

于 2013-05-20T01:54:54.617 に答える