我有以下问题,我是XSLT的新手。我想在 XSLT 1.0 中通过 XSLT 将输入 XML 转换为输出 XML。
输入 xml 如下所示:-
<CardLoadRequest
version="1.0"
fileType="XXX"
designator="VS"
flightNumber="XX"
suffix="-"
flightPaymentIdentifier="2XXXXX"
creationDateTime="2014-01-27T10:41:12+00:00"
legNumber="1"
legOrigin="LXX"
legDestination="BXX"
flightDate="2014-02-27+00:00"
isoCurrencyCode="USD">
<CrewCardLoad employeePayrollNumber="407XXX" crewPaymentIdentifier="XXXXXXX" amount="0.01"></CrewCardLoad>
<CrewCardLoad employeePayrollNumber="408XXX" crewPaymentIdentifier="XXXXXXX" amount="0.01"></CrewCardLoad>
<CrewCardLoad employeePayrollNumber="409XXX" crewPaymentIdentifier="XXXXXXX" amount="0.01"></CrewCardLoad>
</CardLoadRequest>
输出 XML 将如下所示:-
<CardLoadRequest>
<cardLoads>
<cardLoad>
<FinanicalData>
<empid>407XXX</empid>
<cardID>XXXXX</cardID>
<PaymentIdentifier>XXXXXXX</PaymentIdentifier>
<amount>0.01</amount>
</FinanicalData>
<NonFinanicalData>
<id>fileType</id>
<Value>VAACardLoad</Value>
</NonFinanicalData>
<NonFinanicalData>
<id>designator</id>
<Value>VS</Value>
</NonFinanicalData>
<NonFinanicalData>
<id>flightNumber</id>
<Value>XX</Value>
</NonFinanicalData>
<NonFinanicalData>
<id>suffix</id>
<Value>XX</Value>
</NonFinanicalData>
<NonFinanicalData>
<id>flightPaymentIdentifier</id>
<Value>2XXXXX</Value>
</NonFinanicalData>
<NonFinanicalData>
<id>creationDateTime</id>
<Value>2014-01-27T10:41:12+00:00</Value>
</NonFinanicalData>
<NonFinanicalData>
<id>legNumber</id>
<Value>1</Value>
</NonFinanicalData>
<NonFinanicalData>
<id>legOrigin</id>
<Value>LXX</Value>
</NonFinanicalData>
<NonFinanicalData>
<id>legDestination</id>
<Value>BXX</Value>
</NonFinanicalData>
<NonFinanicalData>
<id>flightDate</id>
<Value>2014-02-27+00:00</Value>
</NonFinanicalData>
<NonFinanicalData>
<id>isoCurrencyCode</id>
<Value>USD</Value>
</NonFinanicalData>
</cardLoad>
<cardLoad>
<FinanicalData>
<empid>408XXX</empid>
<cardID>XXXXX</cardID>
<PaymentIdentifier>XXXXXXX</PaymentIdentifier>
<amount>0.01</amount>
</FinanicalData>
<NonFinanicalData>
<id>fileType</id>
<Value>VAACardLoad</Value>
</NonFinanicalData>
<NonFinanicalData>
<id>designator</id>
<Value>VS</Value>
</NonFinanicalData>
<NonFinanicalData>
<id>flightNumber</id>
<Value>XX</Value>
</NonFinanicalData>
<NonFinanicalData>
<id>suffix</id>
<Value>XX</Value>
</NonFinanicalData>
<NonFinanicalData>
<id>flightPaymentIdentifier</id>
<Value>2XXXXX</Value>
</NonFinanicalData>
<NonFinanicalData>
<id>creationDateTime</id>
<Value>2014-01-27T10:41:12+00:00</Value>
</NonFinanicalData>
<NonFinanicalData>
<id>legNumber</id>
<Value>1</Value>
</NonFinanicalData>
<NonFinanicalData>
<id>legOrigin</id>
<Value>LXX</Value>
</NonFinanicalData>
<NonFinanicalData>
<id>legDestination</id>
<Value>BXX</Value>
</NonFinanicalData>
<NonFinanicalData>
<id>flightDate</id>
<Value>2014-02-27+00:00</Value>
</NonFinanicalData>
<NonFinanicalData>
<id>isoCurrencyCode</id>
<Value>USD</Value>
</NonFinanicalData>
</cardLoad>
<cardLoad>
<FinanicalData>
<empid>409XXX</empid>
<cardID>XXXXX</cardID>
<PaymentIdentifier>XXXXXXX</PaymentIdentifier>
<amount>0.01</amount>
</FinanicalData>
<NonFinanicalData>
<id>fileType</id>
<Value>VAACardLoad</Value>
</NonFinanicalData>
<NonFinanicalData>
<id>designator</id>
<Value>VS</Value>
</NonFinanicalData>
<NonFinanicalData>
<id>flightNumber</id>
<Value>XX</Value>
</NonFinanicalData>
<NonFinanicalData>
<id>suffix</id>
<Value>XX</Value>
</NonFinanicalData>
<NonFinanicalData>
<id>flightPaymentIdentifier</id>
<Value>2XXXXX</Value>
</NonFinanicalData>
<NonFinanicalData>
<id>creationDateTime</id>
<Value>2014-01-27T10:41:12+00:00</Value>
</NonFinanicalData>
<NonFinanicalData>
<id>legNumber</id>
<Value>1</Value>
</NonFinanicalData>
<NonFinanicalData>
<id>legOrigin</id>
<Value>LXX</Value>
</NonFinanicalData>
<NonFinanicalData>
<id>legDestination</id>
<Value>BXX</Value>
</NonFinanicalData>
<NonFinanicalData>
<id>flightDate</id>
<Value>2014-02-27+00:00</Value>
</NonFinanicalData>
<NonFinanicalData>
<id>isoCurrencyCode</id>
<Value>USD</Value>
</NonFinanicalData>
</cardLoad>
</cardLoads>
</CardLoadRequest>
请注意,父级是相同和重复的,但孩子是不同的。即使非金融数据可以放入属性中,那也将解决我的问题。
到目前为止,我所做的如下:-
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:fo="http://www.w3.org/1999/XSL/Format">
<xsl:output method="xml" indent="yes" omit-xml-declaration="yes"></xsl:output>
<xsl:template match="/">
<xsl:apply-templates></xsl:apply-templates>
</xsl:template>
<xsl:template match="@*">
<xsl:copy-of select="node()"></xsl:copy-of>
</xsl:template>
<xsl:template name="CrewCardLoad" match="CrewCardLoad">
<CardLoadRequest>
<CardLoad>
<!--NonFinancial Data-->
<NonFinancialData>
<xsl:apply-templates select="@*"></xsl:apply-templates>
</NonFinancialData>
<!--Financial Data-->
<FinancialData>
<xsl:element name="empid">
<xsl:value-of select="@employeePayrollNumber"></xsl:value-of>
</xsl:element>
<xsl:element name="cardid">
<xsl:value-of select="@cardID"></xsl:value-of>
</xsl:element>
<xsl:element name="paymentidentifier">
<xsl:value-of select="@crewPaymentIdentifier"></xsl:value-of>
</xsl:element>
<xsl:element name="amount">
<xsl:value-of select="@amount"></xsl:value-of>
</xsl:element>
</FinancialData>
</CardLoad>
</CardLoadRequest>
</xsl:template>
</xsl:stylesheet>
请尝试以下样式表:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:fo="http://www.w3.org/1999/XSL/Format">
<xsl:output method="xml" indent="yes" omit-xml-declaration="yes"></xsl:output>
<xsl:template match="/">
<CardLoadRequest>
<cardLoads>
<xsl:for-each select="CardLoadRequest/CrewCardLoad">
<cardLoad>
<FinanicalData>
<empid><xsl:value-of select="@employeePayrollNumber"/></empid>
<!-- where did you get this data? -->
<cardID>XXXXX</cardID>
<PaymentIdentifier><xsl:value-of select="@crewPaymentIdentifier"/></PaymentIdentifier>
<amount><xsl:value-of select="@amount"/></amount>
</FinanicalData>
<xsl:for-each select="../@*[not(name()='version')]">
<NonFinanicalData>
<id><xsl:value-of select="name()"/></id>
<Value><xsl:value-of select="."/></Value>
</NonFinanicalData>
</xsl:for-each>
</cardLoad>
</xsl:for-each>
</cardLoads>
</CardLoadRequest>
</xsl:template>
</xsl:stylesheet>
这将输出:
<CardLoadRequest xmlns:fo="http://www.w3.org/1999/XSL/Format">
<cardLoads>
<cardLoad>
<FinanicalData>
<empid>407XXX</empid>
<cardID>XXXXX</cardID>
<PaymentIdentifier>XXXXXXX</PaymentIdentifier>
<amount>0.01</amount>
</FinanicalData>
<NonFinanicalData>
<id>fileType</id>
<Value>XXX</Value>
</NonFinanicalData>
<NonFinanicalData>
<id>designator</id>
<Value>VS</Value>
</NonFinanicalData>
<NonFinanicalData>
<id>flightNumber</id>
<Value>XX</Value>
</NonFinanicalData>
<NonFinanicalData>
<id>suffix</id>
<Value>-</Value>
</NonFinanicalData>
<NonFinanicalData>
<id>flightPaymentIdentifier</id>
<Value>2XXXXX</Value>
</NonFinanicalData>
<NonFinanicalData>
<id>creationDateTime</id>
<Value>2014-01-27T10:41:12+00:00</Value>
</NonFinanicalData>
<NonFinanicalData>
<id>legNumber</id>
<Value>1</Value>
</NonFinanicalData>
<NonFinanicalData>
<id>legOrigin</id>
<Value>LXX</Value>
</NonFinanicalData>
<NonFinanicalData>
<id>legDestination</id>
<Value>BXX</Value>
</NonFinanicalData>
<NonFinanicalData>
<id>flightDate</id>
<Value>2014-02-27+00:00</Value>
</NonFinanicalData>
<NonFinanicalData>
<id>isoCurrencyCode</id>
<Value>USD</Value>
</NonFinanicalData>
</cardLoad>
<cardLoad>
<FinanicalData>
<empid>408XXX</empid>
<cardID>XXXXX</cardID>
<PaymentIdentifier>XXXXXXX</PaymentIdentifier>
<amount>0.01</amount>
</FinanicalData>
<NonFinanicalData>
<id>fileType</id>
<Value>XXX</Value>
</NonFinanicalData>
<NonFinanicalData>
<id>designator</id>
<Value>VS</Value>
</NonFinanicalData>
<NonFinanicalData>
<id>flightNumber</id>
<Value>XX</Value>
</NonFinanicalData>
<NonFinanicalData>
<id>suffix</id>
<Value>-</Value>
</NonFinanicalData>
<NonFinanicalData>
<id>flightPaymentIdentifier</id>
<Value>2XXXXX</Value>
</NonFinanicalData>
<NonFinanicalData>
<id>creationDateTime</id>
<Value>2014-01-27T10:41:12+00:00</Value>
</NonFinanicalData>
<NonFinanicalData>
<id>legNumber</id>
<Value>1</Value>
</NonFinanicalData>
<NonFinanicalData>
<id>legOrigin</id>
<Value>LXX</Value>
</NonFinanicalData>
<NonFinanicalData>
<id>legDestination</id>
<Value>BXX</Value>
</NonFinanicalData>
<NonFinanicalData>
<id>flightDate</id>
<Value>2014-02-27+00:00</Value>
</NonFinanicalData>
<NonFinanicalData>
<id>isoCurrencyCode</id>
<Value>USD</Value>
</NonFinanicalData>
</cardLoad>
<cardLoad>
<FinanicalData>
<empid>409XXX</empid>
<cardID>XXXXX</cardID>
<PaymentIdentifier>XXXXXXX</PaymentIdentifier>
<amount>0.01</amount>
</FinanicalData>
<NonFinanicalData>
<id>fileType</id>
<Value>XXX</Value>
</NonFinanicalData>
<NonFinanicalData>
<id>designator</id>
<Value>VS</Value>
</NonFinanicalData>
<NonFinanicalData>
<id>flightNumber</id>
<Value>XX</Value>
</NonFinanicalData>
<NonFinanicalData>
<id>suffix</id>
<Value>-</Value>
</NonFinanicalData>
<NonFinanicalData>
<id>flightPaymentIdentifier</id>
<Value>2XXXXX</Value>
</NonFinanicalData>
<NonFinanicalData>
<id>creationDateTime</id>
<Value>2014-01-27T10:41:12+00:00</Value>
</NonFinanicalData>
<NonFinanicalData>
<id>legNumber</id>
<Value>1</Value>
</NonFinanicalData>
<NonFinanicalData>
<id>legOrigin</id>
<Value>LXX</Value>
</NonFinanicalData>
<NonFinanicalData>
<id>legDestination</id>
<Value>BXX</Value>
</NonFinanicalData>
<NonFinanicalData>
<id>flightDate</id>
<Value>2014-02-27+00:00</Value>
</NonFinanicalData>
<NonFinanicalData>
<id>isoCurrencyCode</id>
<Value>USD</Value>
</NonFinanicalData>
</cardLoad>
</cardLoads>
</CardLoadRequest>
如果您不打算使用它,请删除样式表中的xmlns:fo="http://www.w3.org/1999/XSL/Format"
。
附言你欠我一杯咖啡。 :D