xslt mapping - 数据库集合

时间:2018-03-14 09:46:47

标签: xslt-1.0

实际上是XSLT的新手。我使用JDeveloper对每个循环进行圆顶简单转换,同时处理数据库输出。 我目前的业务需要一个基于条件的选择。我有以下输入xml

 <?xml version = '1.0' encoding = 'UTF-8'?>
    <response>
       <head>
          <headSeq>101</headSeq>
          <date>12/03/2018</date>
       </head>
       <lines>
          <lineItem>
             <lineId>L101</lineId>
             <item>Laptop</item>
             <itemName>Dell</itemName>
             <cId>201</cId>
          </lineItem>
          <lineItem>
             <lineId>L102</lineId>
             <item>Laptop</item>
             <itemName>Dell</itemName>  
             <cId>202</cId>
          </lineItem>
           <lineItem>
             <lineId>L103</lineId>
             <item>Laptop</item>
             <itemName>Dell</itemName>
             <cId>202</cId>
          </lineItem>
       </lines>
       <configs>
          <configItem>
             <configId>201</configId>
             <configName>I3</configName>
          </configItem>
          <configItem>
             <configId>202</configId>
             <configName>I5</configName>
          </configItem>
       </configs>
    </response>

必需的输出是

    <?xml version = '1.0' encoding = 'UTF-8'?>
    <ns0:lineTblRoot>
       <ns0:lineTbl>
          <ns0:headSeq>101</ns0:headSeq>
          <ns0:lineId>L101</ns0:lineId>
          <ns0:item>Laptop</ns0:item>
          <ns0:itemName>Dell</ns0:itemName>
          <ns0:configId>201</ns0:configId>
          <ns0:configName>I3</ns0:configName>
       </ns0:lineTbl>
       <ns0:lineTbl>
          <ns0:headSeq>101</ns0:headSeq>
          <ns0:lineId>L102</ns0:lineId>
          <ns0:item>Laptop</ns0:item>
          <ns0:itemName>Dell</ns0:itemName>
          <ns0:configId>202</ns0:configId>
          <ns0:configName>I5</ns0:configName>
       </ns0:lineTbl>
       <ns0:lineTbl>
          <ns0:headSeq>101</ns0:headSeq>
          <ns0:lineId>L103</ns0:lineId>
          <ns0:item>Laptop</ns0:item>
          <ns0:itemName>Dell</ns0:itemName>
          <ns0:configId>202</ns0:configId>
          <ns0:configName>I5</ns0:configName>
       </ns0:lineTbl>
    </ns0:lineTblRoot>

以下XSLT不会产生正确的结果。

<xsl:template match="/">
      <ns0:lineTblRoot>
         <xsl:for-each select="/ns0:response/ns0:lines/ns0:lineItem">
            <ns0:lineTbl>
               <ns0:headSeq>
                  <xsl:value-of select="/ns0:response/ns0:head/ns0:headSeq"/>
               </ns0:headSeq>
               <ns0:lineId>
                  <xsl:value-of select="ns0:lineId"/>
               </ns0:lineId>
               <ns0:item>
                  <xsl:value-of select="ns0:item"/>
               </ns0:item>
               <ns0:itemName>
                  <xsl:value-of select="ns0:itemName"/>
               </ns0:itemName>
               <ns0:configId>
                  <xsl:value-of select="ns0:cId"/>
               </ns0:configId>
               <xsl:for-each select="/ns0:response/ns0:configs/ns0:configItem">
                  <xsl:choose>
                     <xsl:when test="/ns0:response/ns0:lines/ns0:lineItem/ns0:cId = /ns0:response/ns0:configs/ns0:configItem/ns0:configId"/>
                  </xsl:choose>
               </xsl:for-each>
               <ns0:configName>
                  <xsl:value-of select="/ns0:response/ns0:configs/ns0:configItem/ns0:configName"/>
               </ns0:configName>
            </ns0:lineTbl>             
         </xsl:for-each>
      </ns0:lineTblRoot>
   </xsl:template>

需要根据与configItem中的configID匹配的lineItem中的cId选择configName 我在这里想念一下吗?请帮忙。

1 个答案:

答案 0 :(得分:0)

您将元素与命名空间匹配,但输入不包含任何命名空间,请使用以下代码:

<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:ns0="http://xmlns.telenet.be/messages/GN/v001"
    exclude-result-prefixes="ns0">


    <xsl:template match="/">
        <ns0:lineTblRoot>
            <xsl:for-each select="descendant::lineItem">
                <xsl:variable name="cId" select="cId"/>
                <ns0:lineTbl>
                    <ns0:headSeq>
                        <xsl:value-of select="//response/head/headSeq"/>
                    </ns0:headSeq>
                    <ns0:lineId>
                        <xsl:value-of select="lineId"/>
                    </ns0:lineId>
                    <ns0:item>
                        <xsl:value-of select="item"/>
                    </ns0:item>
                    <ns0:itemName>
                        <xsl:value-of select="itemName"/>
                    </ns0:itemName>

                    <ns0:configId>
                        <xsl:value-of select="//configs/configItem/configId[. = $cId]"/>
                    </ns0:configId>

                    <ns0:configName>
                        <xsl:value-of select="//configs/configItem[configId = $cId]/configName"/>
                    </ns0:configName>
                </ns0:lineTbl>
            </xsl:for-each>

        </ns0:lineTblRoot>
    </xsl:template>

</xsl:stylesheet>