如何基于XSL 1.0中的元素填充值

时间:2016-04-07 07:07:50

标签: xslt xslt-1.0 jdeveloper

我的源示例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行。 在Tar​​get中,我应该能够根据产品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中执行此操作?

1 个答案:

答案 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中它们是不同的。