我的源示例XML如下所示
<QuoteData>
<Components>
<Component ServiceOfferingId="XX" StartDate="07/03/2016" EndDate="12/31/9999" SerialOrderNbr="xx" StopReasonCode="" IsBundle="N">
<ServiceItem ItemType="xx" Type="2072" ModelFeature="24E" ProductId="2072 24E" SerialOrderNbr="xx" Quantity="1" StartDate="07/03/2016" EndDate="12/31/9999" CustomerId="xx" ServiceLevelId="xx"/>
</Component>
<Component ServiceOfferingId="yy" StartDate="07/03/2016" EndDate="12/31/9999" SerialOrderNbr="yy" StopReasonCode="" IsBundle="N">
<ServiceItem ItemType="yy" Type="2072" ModelFeature="24C" ProductId="2072 24C" SerialOrderNbr="yy" Quantity="1" StartDate="07/03/2016" EndDate="12/31/9999" CustomerId="yy" ServiceLevelId="yy"/>
<ServiceItem ItemType="zz" Type="2072" ModelFeature="24E" ProductId="2072 24E" SerialOrderNbr="zz" Quantity="1" StartDate="07/03/2016" EndDate="12/31/9999" CustomerId="zz" ServiceLevelId="zz"/>
</Component>
</Components>
<Descriptions>
<ProductDescription Id="2072 24E" Description="Customer EXPANSION"/>
<ProductDescription Id="2072 24C" Description="Customer CONTROL"/>
</Descriptions>
</QuoteData>
根据要求,每个ServiceItem都应转换为Line。因此,在上述情况下,将创建3行。 在Target中,我应该能够根据产品ID值填充产品描述。目前我无法使用XSL 1.0
预期目标XML应如下所示:
<Payload>
<Header></Header>
<Line>
<SerialOrderNbr>xx</SerialOrderNbr>
<ModelFeature>24E</ModelFeature>
<ProductId>2072 24E</ProductId>
<ProductDescription>Customer EXPANSION</ProductDescription>
</Line>
<Line>
<SerialOrderNbr>xx</SerialOrderNbr>
<ModelFeature>24C</ModelFeature>
<ProductId>2072 24C</ProductId>
<ProductDescription>Customer CONTROL</ProductDescription>
</Line>
<Line>
<SerialOrderNbr>xx</SerialOrderNbr>
<ModelFeature>24E</ModelFeature>
<ProductId>2072 24E</ProductId>
<ProductDescription>Customer EXPANSION</ProductDescription>
</Line>
</Payload>
我尝试使用不同的函数来填充目标描述,但是我要么在所有行中获得第一个Description值,要么根本没有填充任何值。我能够使用while循环实现所需的功能,并在Jdev 11g中分配活动。
如何在XSLT中执行此操作?
答案 0 :(得分:0)
使用以下样式表很容易:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="xml" />
<xsl:template match="/QuoteData">
<Payload>
<xsl:for-each select="//ServiceItem">
<line>
<SerialOrderNbr><xsl:value-of select="@SerialOrderNbr" /></SerialOrderNbr>
<ModelFeature><xsl:value-of select="@ModelFeature" /></ModelFeature>
<ProductId><xsl:value-of select="@ProductId" /></ProductId>
<ProductDescription><xsl:value-of select="//ProductDescription[@Id = current()/@ProductId]/@Description" /></ProductDescription>
</line>
</xsl:for-each>
</Payload>
</xsl:template>
</xsl:stylesheet>
它的输出是:
<?xml version="1.0"?>
<Payload>
<line>
<SerialOrderNbr>xx</SerialOrderNbr>
<ModelFeature>24E</ModelFeature>
<ProductId>2072 24E</ProductId>
<ProductDescription>Customer EXPANSION</ProductDescription>
</line>
<line>
<SerialOrderNbr>yy</SerialOrderNbr>
<ModelFeature>24C</ModelFeature>
<ProductId>2072 24C</ProductId>
<ProductDescription>Customer CONTROL</ProductDescription>
</line>
<line>
<SerialOrderNbr>zz</SerialOrderNbr>
<ModelFeature>24E</ModelFeature>
<ProductId>2072 24E</ProductId>
<ProductDescription>Customer EXPANSION</ProductDescription>
</line>
</Payload>
这并不是您声称的预期输出,因为您所需输出的版本似乎是错误的。在您的输出版本中,所有SerialOrderNbr
都有&#39; xx&#39;作为值,但在源XML中它们是不同的。