私は探し回りましたが、私が見つけたアイデアをうまく機能させることができませんでした。
これらは、xml ファイル (db から生成される) にあるいくつかのノードです。
<PANELS>
<PANEL ATTR1="7" ATTR2="37" ATTR3="31"/>
<PANEL ATTR1="8" ATTR2="37" ATTR3="31"/>
<PANEL ATTR1="8A" ATTR2="37" ATTR3="31"/>
</PANELS>
<ZONES>
<ZONE ATTR1="7" ATTR2="37" ATTR3="31" />
<ZONE ATTR1="8" ATTR2="37" ATTR3="31" />
<ZONE ATTR1="8A" ATTR2="37" ATTR3="31" />
</ZONES>
これらのそれぞれから個別の ATTR3 を選択できるようにしたいと考えています。
現在、これは最初のもので機能し、
//PANELS/PANEL[not(@ATTR3 = (preceding::*/@ATTR3))]
「31」の期待される結果を返します
しかし、2番目のものに対して同じことをしようとすると、何も返されません(もう一度「31」を返したい)
//ZONES/ZONE[not(@ATTR3 = (preceding::*/@ATTR3))]
ATTR3 の値がそれらすべてで同じであるため、2 番目のものが機能しないことは理解していますが、ノードごとに個別の属性値を取得するにはどうすればよいですか?
(これは、個別の値を表示するために使用している for-each の述語として使用されています)
これは、このように使用されています。これらの 1 つはゾーンfor-each
用で、もう 1 つはパネル用です。
<xsl:for-each select="//PANELS/PANEL[not(@ATTR3 = (preceding::*/@ATTR3))]">
<xsl:sort select="@ATTR3"/>
<xsl:value-of select="@ATTR3" />
<xsl:if test="position()!=last()">, </xsl:if>
</xsl:for-each>
返してほしい
PANELS: 31
ZONES: 31
preceding-sibling
の代わりに使ってみましpreceding
たが、
PANELS: 31, 31
ZONES: 31
それぞれが次のようなテンプレートになっています。
<xsl:template match="//HEADER/ZONES" >
<fo:block font-size="10pt">
<fo:table table-layout="fixed" >
<fo:table-column column-width="proportional-column-width(1)"/>
<fo:table-column column-width="proportional-column-width(7)"/>
<fo:table-body>
<fo:table-row>
<fo:table-cell border-bottom="none">
<fo:block font-weight="bold">
<xsl:text>Zones:</xsl:text>
</fo:block>
</fo:table-cell >
<fo:table-cell>
<fo:block>
<xsl:for-each select="//HEADER/ZONES/ZONE[not(@ATTR3 = (preceding-sibling::*/@ATTR3))]">
<xsl:sort select="@ATTR3"/>
<xsl:value-of select="@ATTR3" />
<xsl:if test="position()!=last()">, </xsl:if>
</xsl:for-each>
</fo:block>
</fo:table-cell>
</fo:table-row>
</fo:table-body>
</fo:table>
</fo:block>
</xsl:template>