0

値をハードコーディングしていcolspanますが、たとえば、xsl:variable?

問題は、XSL を使用して表示しようとしているものよりも多くの属性が XML ノードに含まれているため、カウントのために XML 自体を参照できないことです。そのため、代わりに XSL 内の html テンプレートを参照できないかと考えています。

サンプル XML:

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="xsl/allcompanies.xsl"?>
<Companies>
    <row Name="Company One" Address="Grote Markt 1" ZIP="1000" City="BRUSSEL" Country="BE" Telephone="02 261 05 55" Fax="" Email="" />
    <row Name="Company Two" Address="Tielweg 10" ZIP="2803 PK" City="Gouda" Country="NL" Telephone="" Fax="" Email=""/>
    <row Name="Company Three" Address="6 S.Millrock Drive" ZIP="UT 84121" City="Salt Lake City" Country="US" Telephone="+1 801 928 0000" Fax="" Email="" />
</Companies>

XSL:

<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:template match="/">
    <html>
    <body>
    <table>
        <tr>
            <th colspan="6">Companies</th>
        </tr>
        <tr>
            <th>Name</th>
            <th>Address</th>
            <th>ZIP</th>
            <th>City</th>
            <th>Country</th>
            <th>Telephone</th>
        </tr>
        <xsl:for-each select="Companies/row">
        <tr>
            <td><xsl:value-of select="@Name"/></td>
            <td><xsl:value-of select="@Address"/></td>
            <td><xsl:value-of select="@ZIP"/></td>
            <td><xsl:value-of select="@City"/></td>
            <td><xsl:value-of select="@Country"/></td>
            <td><xsl:value-of select="@Telephone"/></td>
        </tr>
        </xsl:for-each>
    </table>
    </body>
    </html>
</xsl:template>
</xsl:transform>

私はその線に沿って何かを考えていました

<th colspan="{count(//table/tr[last()]/td)}">Companies</th>

しかし、それから何かが...うまくいきます。

私がここで試みていること ( a を設定することcolspan) はもちろん自明であることを十分に理解しており、根底にある問題、つまりそれ自体にxslt適用するという問題を突いてみようとしXPathています。

4

1 に答える 1

1

それほど遠くはありませんが、式は入力 XML の構造を説明する必要があります。

colspan="{count(//Companies/row[last()]/@*)}"

入力 XML にはtabletrおよびtd要素はありません。

XSLT スタイルシートで生成されているテーブル セルを数えようとしたことは理解していますが、この情報は入力 XML からも取得でき、より簡単です。


その上、ある場所でセルの数を動的にカウントしたいのですが、別の場所で表のセルに変換する必要がある属性をハードコーディングするのはなぜですか?

編集:現在のスタイルシートのノードにアクセスする理論的な可能性について尋ねるつもりだったことがわかりました。はい、これを行う方法があります。

XSLT1.0

XSLT 1.0 に制限されている場合は、document()関数を使用しますが、解決する URI を指定しません。

<xsl:value-of select="count(document('')//td)"/>

Michael Kay の「XSLT 2.0 Programmer's Reference」には、次のように書かれています。

[document('')] はスタイルシート自体を指します。この構造は XSLT 1.0 でよく使用され、スタイルシート自体でルックアップ テーブルを維持するための便利な方法を提供していました。

たとえば、この同様の SO の質問を参照してください。

XSLT 2.0

要素内のテーブル セルに変換する必要がある属性に関する情報を格納しますxsl:variablecolspan次に、その内容にアクセスして、テーブルを生成し、属性の値を決定します。

実際には、結果ツリーのフラグメントをノードセットに変換する手段(EXSLT 関数など)があれば、これは XSLT 1.0 でも行うことができます。

于 2014-03-21T10:45:48.487 に答える