如何在XSL1.0中基于元素填充值



我的源示例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都应转换为一行。因此,在上述情况下,应创建3行。在目标中,我应该能够根据产品ID值填充产品描述。目前,我无法使用XSL1.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中做到这一点?

使用以下样式表很容易:

<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的值都是"xx",但在源XML中它们是不同的。

相关内容

  • 没有找到相关文章

最新更新