gpt4 book ai didi

xml - 使用 XPath - 如何选择/计算直接兄弟?

转载 作者:行者123 更新时间:2023-12-03 16:54:34 25 4
gpt4 key购买 nike

我正在尝试将具有相同值的紧随其后的 sibling 组合在一起。但我无法只选择 IMMEDIATE sibling 。

输入:

<ROWS>
<ROW>
<MONTH>1</MONTH>
<START_DATE>15/04/2013</START_DATE>
<RATE_AMOUNT>10</RATE_AMOUNT>
<DISCOUNT>-2</DISCOUNT>
</ROW>
<ROW>
<MONTH>2</MONTH>
<START_DATE>15/05/2013</START_DATE>
<RATE_AMOUNT>10</RATE_AMOUNT>
<DISCOUNT>-2</DISCOUNT>
</ROW>
<ROW>
<MONTH>3</MONTH>
<START_DATE>15/06/2013</START_DATE>
<RATE_AMOUNT>10</RATE_AMOUNT>
<DISCOUNT>-5</DISCOUNT>
</ROW>
<ROW>
<MONTH>4</MONTH>
<START_DATE>15/07/2013</START_DATE>
<RATE_AMOUNT>10</RATE_AMOUNT>
<DISCOUNT>-2</DISCOUNT>
</ROW>
</ROWS>

预期输出:
<RateList>
<Rate>
<NoOfMonths>2</NoOfMonths>
<StartDate>15/04/2013</StartDate>
<RateAmount>10</RateAmount>
<Discount>-2</Discount>
</Rate>
<Rate>
<NoOfMonths>1</NoOfMonths>
<StartDate>15/06/2013</StartDate>
<RateAmount>10</RateAmount>
<Discount>-5</Discount>
</Rate>
<Rate>
<NoOfMonths>1</NoOfMonths>
<StartDate>15/07/2013</StartDate>
<RateAmount>10</RateAmount>
<Discount>-2</Discount>
</Rate>
</RateList>

这是我的 XSL:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="/">
<RateList>
<xsl:apply-templates/>
</RateList>
</xsl:template>
<xsl:template match="ROW">
<xsl:variable name="noOfMonths" select=".|following-sibling::*[RATE_AMOUNT=current()/RATE_AMOUNT][DISCOUNT=current()/DISCOUNT]"/>
<xsl:if test="not(preceding-sibling::*[RATE_AMOUNT=current()/RATE_AMOUNT][DISCOUNT=current()/DISCOUNT])">
<Rate>
<NoOfMonths>
<xsl:value-of select="count($noOfMonths)"/>
</NoOfMonths>
<StartDate>
<xsl:value-of select="START_DATE"/>
</StartDate>
<RateAmount>
<xsl:value-of select="RATE_AMOUNT"/>
</RateAmount>
<Discount>
<xsl:value-of select="DISCOUNT"/>
</Discount>
</Rate>
</xsl:if>
</xsl:template>
</xsl:stylesheet>

这是我得到的输出:
<RateList>
<Rate>
<NoOfMonths>3</NoOfMonths>
<StartDate>15/04/2013</StartDate>
<RateAmount>10</RateAmount>
<Discount>-2</Discount>
</Rate>
<Rate>
<NoOfMonths>1</NoOfMonths>
<StartDate>15/06/2013</StartDate>
<RateAmount>10</RateAmount>
<Discount>-5</Discount>
</Rate>
</RateList>

有人可以帮忙吗?如何仅选择/计算直接 sibling ?

谢谢!

最佳答案

试试这个(xslt中的一些解释作为评论):

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="/">
<RateList>
<xsl:apply-templates select="*/ROW"/>
</RateList>
</xsl:template>
<xsl:template match="ROW">

<!--Look for preceding row which has not the same data (RATE_AMOUNT and DISCOUNT ) as the current.
And generate a id, here month concatenated with an '#'.-->
<xsl:variable name="notSameData"
select="concat(preceding-sibling::ROW
[not(RATE_AMOUNT=current()/RATE_AMOUNT
and DISCOUNT=current()/DISCOUNT )][1]/MONTH,'#')"/>

<!--Count following month which has same data as current
and also the same preceding month with not the same data as the current-->
<xsl:variable name="noOfMonths"
select="count(following-sibling::*
[ RATE_AMOUNT=preceding-sibling::*[1]/RATE_AMOUNT and
DISCOUNT = preceding-sibling::*[1]/DISCOUNT]
[
concat(preceding-sibling::ROW
[not(RATE_AMOUNT=current()/RATE_AMOUNT
and DISCOUNT=current()/DISCOUNT )][1]/MONTH,'#') = $notSameData
]) +1 "/>

<!--Output only for rows which don not have a not a direct (first) preceding one with same data.-->
<xsl:if test="not(preceding-sibling::ROW[1][RATE_AMOUNT=current()/RATE_AMOUNT][DISCOUNT=current()/DISCOUNT])">
<Rate>
<NoOfMonths>
<xsl:value-of select="$noOfMonths"/>
</NoOfMonths>
<StartDate>
<xsl:value-of select="START_DATE"/>
</StartDate>
<RateAmount>
<xsl:value-of select="RATE_AMOUNT"/>
</RateAmount>
<Discount>
<xsl:value-of select="DISCOUNT"/>
</Discount>
</Rate>
</xsl:if>
</xsl:template>
</xsl:stylesheet>

这将生成以下输出:
<?xml version="1.0"?>
<RateList>
<Rate>
<NoOfMonths>2</NoOfMonths>
<StartDate>15/04/2013</StartDate>
<RateAmount>10</RateAmount>
<Discount>-2</Discount>
</Rate>
<Rate>
<NoOfMonths>1</NoOfMonths>
<StartDate>15/06/2013</StartDate>
<RateAmount>10</RateAmount>
<Discount>-5</Discount>
</Rate>
<Rate>
<NoOfMonths>1</NoOfMonths>
<StartDate>15/07/2013</StartDate>
<RateAmount>10</RateAmount>
<Discount>-2</Discount>
</Rate>
</RateList>

评论:我没有使用 xlt:key 因为我最喜欢的 xlst 处理器 xsltproc 不支持 xls:key 语句中的 current() 。

关于xml - 使用 XPath - 如何选择/计算直接兄弟?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16513388/

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