我四处寻找,但无法获得任何我发现可行的想法。
这些是我在 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' 的预期结果
但是当我尝试对第二个做同样的事情时,它什么也没有返回(我希望它再次返回'31')
//ZONES/ZONE[not(@ATTR3 = (preceding::*/@ATTR3))]
我知道第二个不起作用,因为 ATTR3 的值对于所有这些都相同,但是如何获得每个节点的不同属性值?
(这被用作我用来显示每个不同值的 for-each 的谓词)
这是这样使用的,其中一个for-each
用于ZONES,一个用于PANELS
<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>