Я искал вокруг, но не смог заставить работать ни одну из идей, которые я нашел.
Это пара узлов, которые у меня есть в файле xml (который создается из базы данных)
<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
для ЗОН и один для ПАНЕЛЕЙ.
<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>
preceding-sibling
вместоpreceding
? - person O. R. Mapper   schedule 06.07.2012<PANEL>
и еще раз 31 из первого элемента<ZONE>
. Вот что я получаю от//PANELS/PANEL[not(@ATTR3 = (preceding-sibling::*/@ATTR3))] | //ZONES/ZONE[not(@ATTR3 = (preceding-sibling::*/@ATTR3))]
. - person O. R. Mapper   schedule 06.07.2012PANELS: 31 ZONES: 31
, если вставлю приведенный выше фрагмент XSLT и эквивалентный фрагмент для<Zones>
в шаблон, соответствующий/
, используяpreceding-siblings
в обоих циклах<xsl:for-each>
. - person O. R. Mapper   schedule 06.07.2012ZONES: 31 ZONES: 31
- person O. R. Mapper   schedule 06.07.2012