使用 XML 和 XSLT for-each 语句连接字段
Concatenate fields using XML and XSLT for-each statement
我一直在处理这个文件,我想做的是在一个元素中列出所有@FlightNumberPublic(由换行字符
分隔)。现在我还需要确保所有@FlightNumberPublic 都是相同的格式,这是“formatFlightNumber”模板所做的。现在一切正常,只是我似乎无法弄清楚如何显示所有@FlightNumberPublic(而不是仅通过 for-each 语句显示的最后一个)。
我的XML是这样的(简体):
<GeneralXMLExportModel xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<Flights>
<Flight>
<CodeSharings>
<CodeSharing FlightNumber="KLM122" FlightNumberIATA="KL122" FlightNumberPublic="KL122">
<Airline Name="KLM" ICAO="KLM" IATA="KL" />
</CodeSharing>
<CodeSharing FlightNumber="DLH422" FlightNumberIATA="DL422" FlightNumberPublic="DL422">
<Airline Name="DLH" ICAO="DLH" IATA="DL" />
</CodeSharing>
</CodeSharings>
</Flight>
</Flights>
</GeneralXMLExportModel>
而我的 XSL 是这样的(也简化了):
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:template match="/">
<Arrivals>
<xsl:for-each select="GeneralXMLExportModel/Flights/Flight">
<xsl:text> 	</xsl:text>
<Arrival>
<xsl:for-each select="CodeSharings/CodeSharing">
<xsl:attribute name="Codesharing"><xsl:call-template name="formatFlightNumber"><xsl:with-param name="unformattedFlightNumber" select="@FlightNumberPublic" /></xsl:call-template></xsl:attribute>
</xsl:for-each>
</Arrival>
</xsl:for-each>
<xsl:text> 	</xsl:text>
</Arrivals>
</xsl:template>
<xsl:template name="formatFlightNumber">
<xsl:param name="unformattedFlightNumber" />
<xsl:choose>
<xsl:when test="$unformattedFlightNumber = ''" >
<!-- Prevent this routine from hanging -->
<xsl:value-of select="$unformattedFlightNumber" />
</xsl:when>
<xsl:when test="contains($unformattedFlightNumber, '-')">
<xsl:variable name="prefix"> <xsl:value-of select="substring-before($unformattedFlightNumber,'-')" /> </xsl:variable>
<xsl:variable name="number"> <xsl:value-of select="substring-after($unformattedFlightNumber,'-')" /> </xsl:variable>
<xsl:value-of select="concat($prefix, $number)" />
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$unformattedFlightNumber" />
</xsl:otherwise>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>
那么输出是这样的:
<Arrivals>
<Arrival Codesharing="DL422" />
</Arrivals>
现在我希望实现的是:
<Arrivals>
<Arrival Codesharing="KL122 DL422" />
</Arrivals>
希望有人能帮忙!
你不能简单地做:
XSLT 1.0
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="/GeneralXMLExportModel">
<Arrivals>
<xsl:for-each select="Flights/Flight">
<Arrival>
<xsl:attribute name="Codesharing">
<xsl:for-each select="CodeSharings/CodeSharing">
<xsl:value-of select="translate(@FlightNumberPublic, '-', '')" />
<xsl:if test="position()!=last()">
<xsl:text> </xsl:text>
</xsl:if>
</xsl:for-each>
</xsl:attribute>
</Arrival>
</xsl:for-each>
</Arrivals>
</xsl:template>
</xsl:stylesheet>
我一直在处理这个文件,我想做的是在一个元素中列出所有@FlightNumberPublic(由换行字符
分隔)。现在我还需要确保所有@FlightNumberPublic 都是相同的格式,这是“formatFlightNumber”模板所做的。现在一切正常,只是我似乎无法弄清楚如何显示所有@FlightNumberPublic(而不是仅通过 for-each 语句显示的最后一个)。
我的XML是这样的(简体):
<GeneralXMLExportModel xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<Flights>
<Flight>
<CodeSharings>
<CodeSharing FlightNumber="KLM122" FlightNumberIATA="KL122" FlightNumberPublic="KL122">
<Airline Name="KLM" ICAO="KLM" IATA="KL" />
</CodeSharing>
<CodeSharing FlightNumber="DLH422" FlightNumberIATA="DL422" FlightNumberPublic="DL422">
<Airline Name="DLH" ICAO="DLH" IATA="DL" />
</CodeSharing>
</CodeSharings>
</Flight>
</Flights>
</GeneralXMLExportModel>
而我的 XSL 是这样的(也简化了):
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:template match="/">
<Arrivals>
<xsl:for-each select="GeneralXMLExportModel/Flights/Flight">
<xsl:text> 	</xsl:text>
<Arrival>
<xsl:for-each select="CodeSharings/CodeSharing">
<xsl:attribute name="Codesharing"><xsl:call-template name="formatFlightNumber"><xsl:with-param name="unformattedFlightNumber" select="@FlightNumberPublic" /></xsl:call-template></xsl:attribute>
</xsl:for-each>
</Arrival>
</xsl:for-each>
<xsl:text> 	</xsl:text>
</Arrivals>
</xsl:template>
<xsl:template name="formatFlightNumber">
<xsl:param name="unformattedFlightNumber" />
<xsl:choose>
<xsl:when test="$unformattedFlightNumber = ''" >
<!-- Prevent this routine from hanging -->
<xsl:value-of select="$unformattedFlightNumber" />
</xsl:when>
<xsl:when test="contains($unformattedFlightNumber, '-')">
<xsl:variable name="prefix"> <xsl:value-of select="substring-before($unformattedFlightNumber,'-')" /> </xsl:variable>
<xsl:variable name="number"> <xsl:value-of select="substring-after($unformattedFlightNumber,'-')" /> </xsl:variable>
<xsl:value-of select="concat($prefix, $number)" />
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$unformattedFlightNumber" />
</xsl:otherwise>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>
那么输出是这样的:
<Arrivals>
<Arrival Codesharing="DL422" />
</Arrivals>
现在我希望实现的是:
<Arrivals>
<Arrival Codesharing="KL122 DL422" />
</Arrivals>
希望有人能帮忙!
你不能简单地做:
XSLT 1.0
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="/GeneralXMLExportModel">
<Arrivals>
<xsl:for-each select="Flights/Flight">
<Arrival>
<xsl:attribute name="Codesharing">
<xsl:for-each select="CodeSharings/CodeSharing">
<xsl:value-of select="translate(@FlightNumberPublic, '-', '')" />
<xsl:if test="position()!=last()">
<xsl:text> </xsl:text>
</xsl:if>
</xsl:for-each>
</xsl:attribute>
</Arrival>
</xsl:for-each>
</Arrivals>
</xsl:template>
</xsl:stylesheet>