1

xsl:for-each-group で問題が発生しましたが、 hereで非常にうまく解決されました。今、私は別の問題を抱えています。私は入力としてこのようなものを持っています。

<?xml version="1.0" encoding="UTF-8"?>

    <body>
       <p name ="section">this is section</p>
       <p name="h-title" other="main">Introduction</p>
       <p name="h1-title " other="other-h1">XSLT and XQuery</p>
       <p name="h2-title" other=" other-h2">XSLT</p>
       <p name="">
          <p1 name="bold"> XSLT is used to write stylesheets.</p1>
       </p>
       <p name="h2-title " name="other-h2">XQuery</p>
       <p name="">
          <p1 name="bold"> XQuery is used to query XML databases.</p1>
       </p>
       <p name="h3-title" name="other-h3">XQuery and stylesheets</p>
       <p name="">
          <p1 name="bold"> XQuery is used to query XML databases.</p1>
       </p>
       <p name ="section">this is section</p>
       <p name="h1-title " other="other-h1">XSLT and XQuery</p>
       <p name="h2-title " other=" other-h2">XSLT</p>
       <p name ="section">this is section</section>
       <p name="h1-title " other="other-h1">XSLT and XQuery</p>
       <p name="h2-title " other=" other-h2">XSLT</p>
    </body>

今、私の欲しい出力はこれです

<?xml version="1.0" encoding="UTF-8"?>
<body>
   <p name="h-title " other="main">Introduction</p>
   <section>
   <p name ="section">this is section</p>
   <h1>
      <p name="h1-title " other="other-h1"> XSLT and XQuery </p>
      <h2>
         <p name="h2-title " other="other-h2">XSLT</p>
         <p name="">
            <p1 name="bold">XSLT is used to write stylesheets.
            </p1>
         </p>
      </h2>
      <h2>
         <p name="h2-title " other="other-h2"> XQuery is used to query XMLdatabases    
         </p>
         <p name="">
            <p name="bold"> XQuery is used to query XML databases.</p>
         </p>
         <h3>
            <p name="h3-title " name="other-h3">XQuery and stylesheets</p>
            <p name="">
            <p1 name="bold"> XQuery is used to query XML databases.</p1>
           </p>
        </h3>
      </h2>
</h1>
</section>
<section>
<p name ="section">this is section</p>
<h1>
            <p name="h1-title " other="other-h1">XSLT and XQuery</p>
       <h2>   
            <p name="h2"-title other=" other-h2">XSLT</p>
       </h2>
</h1>
</section>
<section>
<p name ="section">this is section</p>
<h1>
            <p name="h1-title " other="other-h1">XSLT and XQuery</p>
       <h2>   
            <p name="h2"-title other=" other-h2">XSLT</p>
       </h2>
</h1>
</section>
</body>

使用しているスタイルシート (正しく動作しない)

    <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
      xmlns:xs="http://www.w3.org/2001/XMLSchema"
      xmlns:mf="http://example.com/mf"
      exclude-result-prefixes="xs mf">

    <xsl:param name="prefix" as="xs:string" select="'h'"/>
    <xsl:param name="suffix" as="xs:string" select="'-title'"/>

    <xsl:output method="html" version="4.0" indent="yes"/>

    <xsl:function name="mf:group" as="node()*">
      <xsl:param name="items" as="node()*"/>
      <xsl:param name="level" as="xs:integer"/>
      <xsl:for-each-group select="$items" group-starting-with="p[@name = concat($prefix,$level, $suffix)]">
        <xsl:choose>
          <xsl:when test="not(self::p[@name = concat($prefix, $level, $suffix)])">
            <xsl:apply-templates select="current-group()"/>
          </xsl:when>
          <xsl:otherwise>
            <xsl:element name="h{$level}">
              <xsl:apply-templates select="."/>
              <xsl:sequence select="mf:group(current-group() except ., $level + 1)"/>
            </xsl:element>
          </xsl:otherwise>
        </xsl:choose>
      </xsl:for-each-group>
    </xsl:function>

    <xsl:template match="@* | node()">
      <xsl:copy>
        <xsl:apply-templates select="@* , node()"/>
      </xsl:copy>
    </xsl:template>

    <xsl:template match="body" name ="myTemplate">
      <xsl:copy>
        <xsl:sequence select="mf:group(*, 1)"/>
      </xsl:copy>
    </xsl:template>

   <xsl:template match="body[@name='section']">
        <section>
            <xsl:call-template name="myTemplate"/>
        </section>
    </xsl:template>    
    </xsl:stylesheet>

しかし、これは正しくありません。のようなもの<p name ="section">this is section</p>が広く登場します。それだけでなく、このようなものは他にほとんどありません。誰かが私に対処する方法を教えてください。私sectionは他の人にもそれを行うことができます。これを正しく行う方法を教えてください。

追加した

<body>
<intro>
<p></p>
<p></p>
</intro>

<section>
<para>
</para>
<h1></h2>
<h2></h2>
</section>

<section>
<para>
</para>
<h1></h2>
<h2></h2>
</section>

<sumary>
</summary>
</body>

私がしたこと

<xsl:for-each-group select="*" group-starting-with="p[@name = 'intro']">
            <intro>
                    <xsl:apply-templates select="current()"/>
            </intro>
</xsl:for-each-group>
4

1 に答える 1

2

私はあなたが主に別のグループ化ステップを望んでいると思います。スタイルシート

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:xs="http://www.w3.org/2001/XMLSchema"
  xmlns:mf="http://example.com/mf"
  exclude-result-prefixes="xs mf">

<xsl:param name="prefix" as="xs:string" select="'h'"/>
<xsl:param name="suffix" as="xs:string" select="'-title'"/>

<xsl:output method="html" version="4.0" indent="yes"/>

<xsl:function name="mf:group" as="node()*">
  <xsl:param name="items" as="node()*"/>
  <xsl:param name="level" as="xs:integer"/>
  <xsl:for-each-group select="$items" group-starting-with="p[@name = concat($prefix, $level, $suffix)]">
    <xsl:choose>
      <xsl:when test="not(self::p[@name = concat($prefix, $level, $suffix)])">
        <xsl:apply-templates select="current-group()"/>
      </xsl:when>
      <xsl:otherwise>
        <xsl:element name="h{$level}">
          <xsl:apply-templates select="."/>
          <xsl:sequence select="mf:group(current-group() except ., $level + 1)"/>
        </xsl:element>
      </xsl:otherwise>
    </xsl:choose>
  </xsl:for-each-group>
</xsl:function>

<xsl:template match="@* | node()">
  <xsl:copy>
    <xsl:apply-templates select="@* , node()"/>
  </xsl:copy>
</xsl:template>

<xsl:template match="body">
  <xsl:copy>
    <xsl:for-each-group select="*" group-starting-with="p[@name = 'section']">
      <section>
        <xsl:sequence select="mf:group(current-group(), 1)"/>
      </section>
    </xsl:for-each-group>
  </xsl:copy>
</xsl:template>

</xsl:stylesheet>

修正された入力を変換します

<?xml version="1.0" encoding="UTF-8"?>

    <body>
       <p name ="section">this is section</p>
       <p name="h-title" other="main">Introduction</p>
       <p name="h1-title" other="other-h1">XSLT and XQuery</p>
       <p name="h2-title" other=" other-h2">XSLT</p>
       <p name="">
          <p1 name="bold"> XSLT is used to write stylesheets.</p1>
       </p>
       <p name="h2-title" other="other-h2">XQuery</p>
       <p name="">
          <p1 name="bold"> XQuery is used to query XML databases.</p1>
       </p>
       <p name="h3-title" other="other-h3">XQuery and stylesheets</p>
       <p name="">
          <p1 name="bold"> XQuery is used to query XML databases.</p1>
       </p>
       <p name ="section">this is section</p>
       <p name="h1-title" other="other-h1">XSLT and XQuery</p>
       <p name="h2-title" other=" other-h2">XSLT</p>
       <p name ="section">this is section</p>
       <p name="h1-title" other="other-h1">XSLT and XQuery</p>
       <p name="h2-title" other=" other-h2">XSLT</p>
    </body>

結果に

<body>
   <section>
      <p name="section">this is section</p>
      <p name="h-title" other="main">Introduction</p>
      <h1>
         <p name="h1-title" other="other-h1">XSLT and XQuery</p>
         <h2>
            <p name="h2-title" other=" other-h2">XSLT</p>
            <p name="">

               <p1 name="bold"> XSLT is used to write stylesheets.</p1>

            </p>
         </h2>
         <h2>
            <p name="h2-title" other="other-h2">XQuery</p>
            <p name="">

               <p1 name="bold"> XQuery is used to query XML databases.</p1>

            </p>
            <h3>
               <p name="h3-title" other="other-h3">XQuery and stylesheets</p>
               <p name="">

                  <p1 name="bold"> XQuery is used to query XML databases.</p1>

               </p>
            </h3>
         </h2>
      </h1>
   </section>
   <section>
      <p name="section">this is section</p>
      <h1>
         <p name="h1-title" other="other-h1">XSLT and XQuery</p>
         <h2>
            <p name="h2-title" other=" other-h2">XSLT</p>
         </h2>
      </h1>
   </section>
   <section>
      <p name="section">this is section</p>
      <h1>
         <p name="h1-title" other="other-h1">XSLT and XQuery</p>
         <h2>
            <p name="h2-title" other=" other-h2">XSLT</p>
         </h2>
      </h1>
   </section>
</body>

それはあなたが投稿した構造を持っていると思いますが、<p name="h-title" other="main">Introduction</p>投稿された例がそれを一番上に移動したときに要素がセクション内にあることを除いて。それを行うためのルールがわからないので、それを実装しようとはしていません。その単一の要素を単に上に移動してグループ化を適用しないのか、それとも特定の要素を除外するためのより複雑なルールがあるのか​​を明確にしてください。

[編集]単にすべてp[@name = 't-title']を一番上に移動し、それらをグループ化したくない場合は、上記のスタイルシートの次の適応が機能するはずです。

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:xs="http://www.w3.org/2001/XMLSchema"
  xmlns:mf="http://example.com/mf"
  exclude-result-prefixes="xs mf">

<xsl:param name="prefix" as="xs:string" select="'h'"/>
<xsl:param name="suffix" as="xs:string" select="'-title'"/>

<xsl:output method="html" version="4.0" indent="yes"/>

<xsl:function name="mf:group" as="node()*">
  <xsl:param name="items" as="node()*"/>
  <xsl:param name="level" as="xs:integer"/>
  <xsl:for-each-group select="$items" group-starting-with="p[@name = concat($prefix, $level, $suffix)]">
    <xsl:choose>
      <xsl:when test="not(self::p[@name = concat($prefix, $level, $suffix)])">
        <xsl:apply-templates select="current-group()"/>
      </xsl:when>
      <xsl:otherwise>
        <xsl:element name="h{$level}">
          <xsl:apply-templates select="."/>
          <xsl:sequence select="mf:group(current-group() except ., $level + 1)"/>
        </xsl:element>
      </xsl:otherwise>
    </xsl:choose>
  </xsl:for-each-group>
</xsl:function>

<xsl:template match="@* | node()">
  <xsl:copy>
    <xsl:apply-templates select="@* , node()"/>
  </xsl:copy>
</xsl:template>

<xsl:template match="body">
  <xsl:copy>
    <xsl:apply-templates select="p[@name = 'h-title']"/>
    <xsl:for-each-group select="* except p[@name = 'h-title']" group-starting-with="p[@name = 'section']">
      <section>
        <xsl:sequence select="mf:group(current-group(), 1)"/>
      </section>
    </xsl:for-each-group>
  </xsl:copy>
</xsl:template>

</xsl:stylesheet>
于 2012-07-24T09:47:01.450 に答える