gpt4 book ai didi

xslt - XPath 1.0 选择 sibling 的不同属性

转载 作者:行者123 更新时间:2023-12-04 18:17:36 25 4
gpt4 key购买 nike

我四处寻找,但无法获得任何我发现可行的想法。

这些是我在 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对于 区域 一个用于 面板
<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>

最佳答案

以下 XSLT 使用 preceding-siblings而不是 preceding从而产生正确的 31 重复次数:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:output method="text"/>

<xsl:template match="//HEADER/ZONES">
ZONES:
<xsl:for-each select="//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>
</xsl:template>

<xsl:template match="//HEADER/PANELS">
PANELS:
<xsl:for-each select="//PANELS/PANEL[not(@ATTR3 = (preceding-sibling::*/@ATTR3))]">
<xsl:sort select="@ATTR3"/>
<xsl:value-of select="@ATTR3" />
<xsl:if test="position()!=last()">, </xsl:if>
</xsl:for-each>
</xsl:template>

</xsl:stylesheet>

本文档的输出:
<HEADER>
<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>
</HEADER>

如下:
    ZONES:
31
PANELS:
31

关于xslt - XPath 1.0 选择 sibling 的不同属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11363678/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com