0

誰でも助けることができますか?私は XSLT に非常に慣れていないので、要素のテーブルを作成しようとしています。以下の例を簡略化し、3 つのセルの行に出力を取得することができましたが、行間に不要な空白ができています。

<apply-templates />また、Rows Matchには 2 つ必要ですか?

よろしくお願いします、アレックス

これは XML です。

<?xml version="1.0" encoding="iso-8859-1"?>
    <products>
        <r t='title1'>...</r>
        <r t='title2'>...</r>
        <r t='title3'>...</r>
        <r t='title4'>...</r>
        <r t='title5'>...</r>
        <r t='title6'>...</r>
        <r t='title7'>...</r>
        <r t='title8'>...</r>
        <r t='title9'>...</r>
    </products>

これは XSL です:

<!-- Rows -->
<xsl:template match="r[position() mod 3 = 1]">
    <div class="row">
        <xsl:apply-templates mode="cell" select="." />
        <xsl:apply-templates mode="cell" select="./following-sibling::r[not(position() > 2)]" />
    </div>
</xsl:template>

<!-- Cells -->
<xsl:template match="r" mode="cell">
    <div class="cell">
        <xsl:value-of select="@t"/>
    </div>
</xsl:template>

私の出力(行間の不要な空白に注意してください):

<div class="row">
    <div class="cell">Title1</div>
    <div class="cell">Title2</div>
    <div class="cell">Title3</div>
</div>









<div class="row">
    <div class="cell">Title4</div>
    <div class="cell">Title5</div>
    <div class="cell">Title6</div>
</div>









<div class="row">
    <div class="cell">Title7</div>
    <div class="cell">Title8</div>
    <div class="cell">Title9</div>
</div>
4

1 に答える 1

0

まず、それは無効であるため、XML にすることはできません。「有効な」XML ファイルに複数のルート要素が含まれることはありません。XML のルートには 9 つの "r" 要素があります。

XSLT で処理を試みる前に、まず有効なものから始めてください。

この XSL (「...」がそうでなければ一致するため、 text() の一致を排除するためにテンプレートを追加したことに注意してください:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">
<xsl:template match="r[position() mod 3 = 1]">
    <div class="row">
        <xsl:apply-templates mode="cell" select="." />
        <xsl:apply-templates mode="cell" select="./following-sibling::r[not(position() > 2)]" />
    </div>
</xsl:template>

<xsl:template match="r" mode="cell">
    <div class="cell">
        <xsl:value-of select="@t"/>
    </div>
</xsl:template>

<xsl:template match="text()"/>
</xsl:stylesheet>

Saxon を使用して次の出力を生成します (新しい行はまったくありません)。

<?xml version="1.0" encoding="utf-8"?><div class="row"><div class="cell">title1</div><div class="cell">title2</div><div class="cell">title3</div></div><div class="row"><div class="cell">title4</div><div class="cell">title5</div><div class="cell">title6</div></div><div class="row"><div class="cell">title7</div><div class="cell">title8</div><div class="cell">title9</div></div>

これに <xsl:output indent="yes"/> を追加すると、期待どおりの出力が得られます。また、ルート タグを出力するために <products> の一致を指定しない限り、無効な XML 出力が得られます。

于 2013-06-16T23:30:15.657 に答える