1

XSLTを使用して別の形式に変更したいこのXMLドキュメントがあります。私が現在直面している問題は、親ではなくルートに対するタグの絶対位置を見つけることです。

たとえば、次の例を見てください。

<book>
  <section>
     <chapter>
     </chapter>
  </section>
</book>
<book>
  <section>
     <chapter>
     </chapter>
  </section>
</book>    <book>
  <section>
     <chapter>
     </chapter>
  </section>
</book>    <book>
  <section>
     <chapter>
     </chapter>
  </section>
</book>

必要な出力:

<book id=1>
  <section id=1>
     <chapter id=1>
     </chapter>
  </section>
</book>
<book id=2>
  <section id=2>
     <chapter id=2>
     </chapter>
  </section>
</book>    
<book id=3>
  <section id=3>
     <chapter id=3>
     </chapter>
  </section>
</book>    
<book id=4>
  <section id=4>
     <chapter id=4>
     </chapter>
  </section>
</book>

ブックタグのIDを取得するには、position()を使用することで簡単に実現できますが、セクションとチャプターに移動すると、作業が難しくなります。

この問題の解決策は、セクションとチャプターのカウンターとして機能するグローバル変数を作成することです。これは、これらのタグの1つがドキュメントで見つかるたびに増分しますが、XSLTの変数は定数のように動作します。

前もって感謝します、

fbr

4

3 に答える 3

1

xsl:numberは、この種のシナリオのために作成されました。

これにより、さまざまなフォーマットの数値やカウントを簡単に作成でき、 XSL-FOで目次や図や表のラベルなどによく使用されます(図 3.a、セクション 1.1 など)。

整形式にするために、ドキュメント要素を追加してサンプル XML を調整しました。

このスタイルシートを使用すると、目的の出力が生成されます。

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">

<xsl:template match="/">
            <xsl:apply-templates select="*/book" />
</xsl:template>

    <xsl:template match="*">
        <xsl:copy>
            <xsl:attribute name="id">   
                <xsl:number format="1 " level="single" count="book"/>
            </xsl:attribute>
            <xsl:apply-templates/>
        </xsl:copy>
    </xsl:template>

</xsl:stylesheet>
于 2010-03-06T02:12:09.333 に答える
0

どうですか

<?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="*|@*|text()">
    <xsl:copy>
        <xsl:apply-templates select="*|@*|text()" />
    </xsl:copy>
</xsl:template>

<xsl:template match="book|section|chapter">
    <xsl:copy>
           <xsl:attribute name="ix">
                <xsl:value-of select="1 + count(preceding::*[name() = name(current())])"/>
            </xsl:attribute> 
        <xsl:apply-templates select="*|@*|text()" />
    </xsl:copy>
</xsl:template>
</xsl:stylesheet>

(「id」の代わりに「ix」を使用します。これは、XML 内に同じ ID を持つ複数の要素を含めることはできないためです)

于 2010-03-06T01:31:07.310 に答える
0

ID は整数でなければなりませんか? 一意の ID を生成する簡単な方法は、親を追加して ID を作成することです。

<book id="1">
  <section id="1.1">
     <chapter id="1.1.1">
     </chapter>
  </section>
</book>

その場合position()、再帰を使用して ID を簡単に生成できます。

于 2010-03-05T18:02:38.907 に答える