0

Apache FOP を使用して、PDF ファイルに情報を収集したいと考えています。XML ソースにはいくつかの子ノード a から e があります。

<node>
   <a>some val</a>
   <b>some other val</b>
   <c>more val</c>
   <d>even more val</d>
   <e>a last val</e>
</node>

それらすべてを表示したくありません。a、b、c は常に表示されますが、空の場合もあります。表示される値の最大量は 3 です。したがって、d と e はオプションであり、その順序を維持する必要があります。

残念ながら、XML 構造は変更できません。

そのための適切な XSLT は何ですか? 私は試した

<xsl:for-each select="child::*[name()='a' or name() = 'b' or name() = 'c' or name() = 'd' or name() = 'e'][string-length(.)&gt;0]">
    <xsl:if test="position() &lt;= 3">
        <xsl:value-of select="name()"/>
    </xsl:if>
</xsl:for-each>

しかし、それは私に順序付きリストをもたらしません。:(

4

3 に答える 3

1

@Florian Ruh、あなたの述べた要件は自己一貫性がありません:オプションであり、その順序を維持する必要があります。」

a、b、c が常に表示され、表示される値の最大数が 3 の場合、d と 3 が表示される可能性はありません。

要件を明確にしてください。

あなたが持っているように name() 関数を使用するのは非常に貧弱な形式であることに注意してください。

以下と同等:

<xsl:for-each select="child::*[name()='a' or name() = 'b' or name() = 'c' or name() = 'd' or name() = 'e'][string-length(.)&gt;0]">

は:

<xsl:for-each select="(a|b|c|d|e)[string(.)]">

...そして、私が主張するアプローチは名前空間に対して安全ですが、あなたが使用したアプローチはそうではありません。

于 2013-07-15T16:03:12.333 に答える