代码之家  ›  专栏  ›  技术社区  ›  Balaganesh Mohanavel

xslt映射-DB集合

  •  0
  • Balaganesh Mohanavel  · 技术社区  · 7 年前

    实际上我是XSLT的新手。在处理DB输出时,我使用JDeveloper对每个循环进行dome简单转换。 我当前的业务需要基于条件选择。我有以下输入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 回复  |  直到 7 年前
        1
  •  0
  •   Amrendra Kumar    7 年前

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

    <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>