0

この XML を変換して、XSLT 出力としてタグのページを作成したいので、1 ページあたり 3 としましょう。最終的には次のようになります。

それらをページにグループ化することを除いて、必要なことはすべて行うことができます。

INPUT XML:
<root>
   <element>a</element>
   <element>b</element>
   <element>c</element>
   <element>e</element>
   <element>f</element>
   <element>g</element>
   <element>h</element>
   <element>i</element>
</root>

XSLT RESULT XML:
<root>
   <page num="1">
      <element>a</element>
      <element>b</element>
      <element>c</element>
   </page>
   <page num="2">
      <element>d</element>
      <element>e</element>
      <element>f</element>
   </page>
   <page num="3">
      <element>g</element>
      <element>h</element>
   </page>
</root>

を試しposition() mod Xましたが、xml の 10 個の個別のファイルを分割しようとしているため、順序が重要なようです。exsl:documentこの方法を使用すると、毎回ファイルが上書きされ、最後の要素のみが保持されます。

<exsl:document href="chunk-{position() mod 10}.xml">

それらを順番にループする必要があるようです(1-3、次に4-6、次に7-8)。

注: Linux で xsltproc を使用しているため、EXSL はサポートしていますが、XSLT2.0 はサポートしていません。

4

2 に答える 2

2

次のように、サンプル入力を必要な出力に変換できます。

<xsl:stylesheet 
  version="1.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:param name="block-size" select="3"/>

<xsl:output indent="yes"/>
<xsl:strip-space elements="*"/>

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


<xsl:template match="root">
  <xsl:copy>
    <xsl:apply-templates select="element[(position() - 1) mod $block-size = 0]" mode="page"/>
  </xsl:copy>
</xsl:template>

<xsl:template match="element" mode="page">
  <page num="{position()}">
    <xsl:apply-templates select=". | following-sibling::element[position() &lt; $block-size]"/>
  </page>
</xsl:template>

</xsl:stylesheet>

サンプルが示すように、そのスタイルシートは 1 つの入力ドキュメントを取り、1 つの出力ドキュメントを作成します。

あなたも言及exsl:documentしていますが、あなたが望む結果は単一のドキュメントのように見えるので、それで何をしたいのかわかりません。したがって、それが要件の一部である場合は、作成したいさまざまなドキュメントのサンプルを示してください。

于 2012-10-19T12:08:13.617 に答える
1

これを試して:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:template match="root">
    <xsl:copy>
      <xsl:apply-templates select="element[position() mod 3 = 1]" />
    </xsl:copy>
  </xsl:template>

  <xsl:template match="element">
    <page num="{position()}">
      <xsl:copy-of select=". | following-sibling::element[position() &lt; 3]" />
    </page>
  </xsl:template>
</xsl:stylesheet>

これは簡単な例ですが、原理を説明するには十分です。

于 2012-10-19T12:11:36.237 に答える