给定输入 XML
<FlightOptions>
<item>
<Fares>
<item>
<FareClass>T</FareClass>
<Fare>100</Fare>
<FareType>E</FareType>
<Seats>5</Seats>
</item>
<item>
<FareClass>Y</FareClass>
<Fare>200</Fare>
<FareType>E</FareType>
<Seats>10</Seats>
</item>
<item>
<FareClass>R</FareClass>
<Fare>250</Fare>
<FareType>E</FareType>
<Seats>20</Seats>
</item>
<item>
<FareClass>N</FareClass>
<Fare>100</Fare>
<FareType>F</FareType>
<Seats>5</Seats>
</item>
<item>
<FareClass>M</FareClass>
<Fare>200</Fare>
<FareType>F</FareType>
<Seats>50</Seats>
</item>
<item>
<FareClass>L</FareClass>
<Fare>300</Fare>
<FareType>F</FareType>
<Seats>20</Seats>
</item>
<item>
<FareClass>K</FareClass>
<Fare>400</Fare>
<FareType>F</FareType>
<Seats>5</Seats>
</item>
<item>
<FareClass>E</FareClass>
<Fare>500</Fare>
<FareType>F</FareType>
<Seats>9</Seats>
</item>
</Fares>
<Flight>
<FlightNumber>YY232</FlightNumber>
<Origin>JFK</Origin>
<Destination>LHR</Destination>
<DepTime>1300</DepTime>
<ArrTime>2000</ArrTime>
</Flight>
</item>
</FlightOptions>
并应用 XSL 模板(感谢 Tim C 提供此模板!) -
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="Fares">
<xsl:copy>
<xsl:apply-templates select="item">
<xsl:sort select="FareType"/>
<xsl:sort select="Fare"/>
</xsl:apply-templates>
</xsl:copy>
</xsl:template>
<xsl:template match="Fares/item">
<xsl:if test="not(preceding-sibling::item[FareType=current()/FareType][Seats > 9])">
<xsl:call-template name="identity"/>
</xsl:if>
</xsl:template>
<xsl:template match="Seats[. > 9]">
<xsl:copy>9</xsl:copy>
</xsl:template>
<xsl:template match="@*|node()">
<xsl:call-template name="identity"/>
</xsl:template>
<xsl:template name="identity">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
我们得到以下输出 XML -
<FlightOptions>
<item>
<Fares>
<item>
<FareClass>T</FareClass>
<Fare>100</Fare>
<FareType>E</FareType>
<Seats>5</Seats>
</item>
<item>
<FareClass>Y</FareClass>
<Fare>200</Fare>
<FareType>E</FareType>
<Seats>9</Seats>
</item>
<item>
<FareClass>R</FareClass>
<Fare>250</Fare>
<FareType>E</FareType>
<Seats>9</Seats>
</item>
<item>
<FareClass>N</FareClass>
<Fare>100</Fare>
<FareType>F</FareType>
<Seats>5</Seats>
</item>
<item>
<FareClass>M</FareClass>
<Fare>200</Fare>
<FareType>F</FareType>
<Seats>9</Seats>
</item>
<item>
<FareClass>L</FareClass>
<Fare>300</Fare>
<FareType>F</FareType>
<Seats>9</Seats>
</item>
<item>
<FareClass>K</FareClass>
<Fare>400</Fare>
<FareType>F</FareType>
<Seats>5</Seats>
</item>
<item>
<FareClass>E</FareClass>
<Fare>500</Fare>
<FareType>F</FareType>
<Seats>9</Seats>
</item>
</Fares>
<Flight>
<FlightNumber>YY232</FlightNumber>
<Origin>JFK</Origin>
<Destination>LHR</Destination>
<DepTime>1300</DepTime>
<ArrTime>2000</ArrTime>
</Flight>
</item>
</FlightOptions>
我想要对上面的输出做的是按照每个项目被选中的顺序用字母顺序(A、B、C、D ...)替换 FareClass 标签。此外,我想保持 G 和 Y FareClass 不变。[如果您对 XML/XSL 有疑问,我会问问题 #8074924,该问题由 Tim C 解决。]
输出 XML 需要如下所示:
<FlightOptions>
<item>
<Fares>
<item>
<FareClass>A</FareClass>
<Fare>100</Fare>
<FareType>E</FareType>
<Seats>5</Seats>
</item>
<item>
<FareClass>Y</FareClass>
<Fare>200</Fare>
<FareType>E</FareType>
<Seats>10</Seats>
</item>
<item>
<FareClass>B</FareClass>
<Fare>250</Fare>
<FareType>E</FareType>
<Seats>20</Seats>
</item>
<item>
<FareClass>N</FareClass>
<Fare>100</Fare>
<FareType>F</FareType>
<Seats>5</Seats>
</item>
<item>
<FareClass>C</FareClass>
<Fare>200</Fare>
<FareType>F</FareType>
<Seats>50</Seats>
</item>
<item>
<FareClass>D</FareClass>
<Fare>300</Fare>
<FareType>F</FareType>
<Seats>20</Seats>
</item>
<item>
<FareClass>E</FareClass>
<Fare>400</Fare>
<FareType>F</FareType>
<Seats>5</Seats>
</item>
<item>
<FareClass>F</FareClass>
<Fare>500</Fare>
<FareType>F</FareType>
<Seats>9</Seats>
</item>
</Fares>
<Flight>
<FlightNumber>YY232</FlightNumber>
<Origin>JFK</Origin>
<Destination>LHR</Destination>
<DepTime>1300</DepTime>
<ArrTime>2000</ArrTime>
</Flight>
</item>
</FlightOptions>