输出xml没有显示在XSL

时间:2019-07-04 09:54:42

标签: xml xslt

当我尝试使用xsl执行输入代码时,显示样式表错误。由于我是xslt的新手,因此非常感谢您的帮助。  我需要帮助来从input.xml文件中获取以下输出

当我尝试使用xsl执行输入代码时,显示样式表错误。由于我是xslt的新手,所以我们将不胜感激。

Input XML 
<mfgData>
 <serials>
  <serial>
   <palletSerial>123456</palletSerial>
   <masterSerial>123456789</masterSerial>
   <innerSerial>$</innerSerial>
   <serial>00001</serial>
   <Item>0-500290</Item>
   <fwVer>4.0.11</fwVer>
   <hwVer>S2</hwVer>
   <macId>1234567890ABCDEF</macId>
   <mfgDate>20181005</mfgDate>
   <deliveryId></deliveryId>
  </serial>
  <serial>
   <palletSerial>123456</palletSerial>
   <masterSerial>123456789</masterSerial>
   <innerSerial>$</innerSerial>
   <serial>00002</serial>
   <Item>00290</Item>
   <fwVer>4.0.11</fwVer>
   <hwVer>S2</hwVer>
   <macId>234567890ABCDEFG</macId>
   <mfgDate>20181005</mfgDate>
   <deliveryId></deliveryId>
  </serial>
</mfgData>

XSLT编码     我尝试执行的XSL

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

        <xsl:template name="SERIALSMAP">
    <xsl:param name="pRoot"/>
    <xsl:element name = 'ns0:Send'>
        <xsl:element name = 'ns0:idocData'>
            <xsl:element name = 'ns3:EDI_DC40'>
                <xsl:element name = 'ns1:TABNAM'>EDI_DC40</xsl:element>
                <xsl:element name = 'ns1:DIRECT'>2</xsl:element>
                <xsl:element name = 'ns1:DOCREL'>701</xsl:element>
                <xsl:element name = 'ns1:STATUS'></xsl:element>
                <xsl:element name = 'ns1:IDOCTYP'>ZDSC_SERIAL_PACK</xsl:element>
                <xsl:element name = 'ns1:CIMTYP'></xsl:element>
                <xsl:element name = 'ns1:MESTYP'>ZDSC_SERIAL</xsl:element>
    <xsl:choose>
         <xsl:when test="string-length(normalize-space(//SERIALS[2]/Delivery_ID/text())) > 0" >
           <xsl:element name = 'ns1:MESCOD'>DLV</xsl:element>
         </xsl:when>
         <xsl:otherwise>
          <xsl:element name = 'ns1:MESCOD'>PAC</xsl:element>
         </xsl:otherwise>
       </xsl:choose>                
                <xsl:element name = 'ns1:MESFCT'></xsl:element>
                <xsl:element name = 'ns1:CREDAT'></xsl:element>
                <xsl:element name = 'ns1:CRETIM'></xsl:element>
                <xsl:element name = 'ns1:SNDPOR'></xsl:element>
                <xsl:element name = 'ns1:SNDPRT'></xsl:element>
                <xsl:element name = 'ns1:SNDPRN'></xsl:element>
                <xsl:element name = 'ns1:RCVPOR'></xsl:element>
                <xsl:element name = 'ns1:RCVPRT'></xsl:element>
                <xsl:element name = 'ns1:RCVPRN'></xsl:element>
                <xsl:element name = 'ns1:STD'></xsl:element>
                <xsl:element name = 'ns1:STDVRS'></xsl:element>
                <xsl:element name = 'ns1:STDMES'></xsl:element>
                <xsl:element name = 'ns1:SERIAL'></xsl:element>
            </xsl:element>
            <xsl:element name = 'ns3:ZDSC_SERIAL_DOC_HEAD000GRP'>
                <xsl:element name = 'ns3:ZDSC_SERIAL_DOC_HEAD000'>
                    <xsl:element name = 'ns3:EBELN'><xsl:text>$1</xsl:text>
                </xsl:element>
                <xsl:choose>
         <xsl:when test="string-length(normalize-space(//SERIALS[2]/Delivery_ID/text())) = 1" >
         <xsl:element name = 'ns3:VBELN'><xsl:value-of select="concat('000000000',//SERIALS[2]/Delivery_ID/text())"/></xsl:element>
         </xsl:when>
         <xsl:when test="string-length(normalize-space(//SERIALS[2]/Delivery_ID/text())) = 2" >
         <xsl:element name = 'ns3:VBELN'><xsl:value-of select="concat('00000000',//SERIALS[2]/Delivery_ID/text())"/></xsl:element>
         </xsl:when>
         <xsl:when test="string-length(normalize-space(//SERIALS[2]/Delivery_ID/text())) = 3" >
         <xsl:element name = 'ns3:VBELN'><xsl:value-of select="concat('0000000',//SERIALS[2]/Delivery_ID/text())"/></xsl:element>
         </xsl:when>
         <xsl:when test="string-length(normalize-space(//SERIALS[2]/Delivery_ID/text())) = 4" >
         <xsl:element name = 'ns3:VBELN'><xsl:value-of select="concat('000000',//SERIALS[2]/Delivery_ID/text())"/></xsl:element>
         </xsl:when>
         <xsl:when test="string-length(normalize-space(//SERIALS[2]/Delivery_ID/text())) = 5" >
         <xsl:element name = 'ns3:VBELN'><xsl:value-of select="concat('00000',//SERIALS[2]/Delivery_ID/text())"/></xsl:element>
         </xsl:when>
         <xsl:when test="string-length(normalize-space(//SERIALS[2]/Delivery_ID/text())) = 6" >
         <xsl:element name = 'ns3:VBELN'><xsl:value-of select="concat('0000',//SERIALS[2]/Delivery_ID/text())"/></xsl:element>
         </xsl:when>
         <xsl:when test="string-length(normalize-space(//SERIALS[2]/Delivery_ID/text())) = 7" >
         <xsl:element name = 'ns3:VBELN'><xsl:value-of select="concat('000',//SERIALS[2]/Delivery_ID/text())"/></xsl:element>
         </xsl:when>
         <xsl:when test="string-length(normalize-space(//SERIALS[2]/Delivery_ID/text())) = 8" >
         <xsl:element name = 'ns3:VBELN'><xsl:value-of select="concat('00',//SERIALS[2]/Delivery_ID/text())"/></xsl:element>
         </xsl:when>
         <xsl:when test="string-length(normalize-space(//SERIALS[2]/Delivery_ID/text())) = 9" >
         <xsl:element name = 'ns3:VBELN'><xsl:value-of select="concat('0',//SERIALS[2]/Delivery_ID/text())"/></xsl:element>
         </xsl:when>
         <xsl:when test="string-length(normalize-space(//SERIALS[2]/Delivery_ID/text())) = 10" >
         <xsl:element name = 'ns3:VBELN'><xsl:value-of select="//SERIALS[2]/Delivery_ID/text()"/></xsl:element>
         </xsl:when>
         <xsl:otherwise>
          <xsl:element name = 'ns3:VBELN'><xsl:text>$1</xsl:text></xsl:element>
         </xsl:otherwise>
       </xsl:choose>
                </xsl:element>                              
                <!--xsl:for-each select=".//SERIALS[Pallet_Serial=preceding-sibling::SERIALS/Pallet_Serial]"-->
                <!--xsl:for-each select=".//SERIALS/Pallet_Serial"-->
                <xsl:for-each select=".//SERIALS[not(Pallet_Serial=preceding-sibling::SERIALS/Pallet_Serial)]"> 
                    <xsl:if test="position()!=1">
                        <xsl:call-template name="Pallets">
                            <xsl:with-param name="PalletiD">
                                <xsl:value-of select=".//Pallet_Serial/text()"/>
                            </xsl:with-param>
                        </xsl:call-template>
                    </xsl:if>
                </xsl:for-each>
            </xsl:element>
        </xsl:element>
    </xsl:element>
</xsl:template>
<xsl:template name="Pallets">
    <xsl:param name="PalletiD"/>
    <xsl:element name = 'ns3:ZDSC_SERIAL_PALLET000GRP'>
        <xsl:element name = 'ns3:ZDSC_SERIAL_PALLET000'>
            <xsl:element name = 'ns3:DATAHEADERCOLUMN_SEGNAM'>
                <xsl:text>ZDSC_SERIAL_PALLET000</xsl:text>
            </xsl:element>
            <xsl:element name = 'ns3:EXIDV'>
                <xsl:value-of select="$PalletiD"/>
            </xsl:element>
        </xsl:element>
        <xsl:for-each select="//SERIALS[(Pallet_Serial=$PalletiD) and not(Master_Serial=preceding-sibling::SERIALS/Master_Serial)]">
            <xsl:call-template name="Masters">
                <xsl:with-param name="MasterID">
                    <xsl:value-of select=".//Master_Serial/text()"/>
                </xsl:with-param>
            </xsl:call-template>
        </xsl:for-each>
    </xsl:element>
</xsl:template>
<xsl:template name="Masters">
    <xsl:param name="MasterID"/>
    <xsl:element name = 'ns3:ZDSC_SERIAL_MASTER000GRP'>
        <xsl:element name = 'ns3:ZDSC_SERIAL_MASTER000'>
            <xsl:element name = 'ns3:DATAHEADERCOLUMN_SEGNAM'>
                <xsl:text>ZDSC_SERIAL_MASTER000</xsl:text>
            </xsl:element>
            <xsl:element name = 'ns3:EXIDV'>
                <xsl:value-of select="$MasterID"/>
            </xsl:element>
        </xsl:element>

        <!--xsl:for-each select="//SERIALS[(Master_Serial=$MasterID) and not(Inner_Serial=preceding-sibling::SERIALS/Inner_Serial)]"-->
        <xsl:for-each select="//SERIALS[(Master_Serial=$MasterID) and not(Inner_Serial=preceding-sibling::SERIALS/Inner_Serial)]">  
            <xsl:variable name="InnerSerialID">
                <xsl:value-of select=".//Inner_Serial/text()"/>
            </xsl:variable>
            <xsl:choose>
                <xsl:when test="$InnerSerialID='$'">
                    <xsl:element name = 'ns3:ZDSC_SERIAL_INNER000GRP'>
                    <xsl:element name = 'ns3:ZDSC_SERIAL_INNER000'>
                        <xsl:element name = 'ns3:DATAHEADERCOLUMN_SEGNAM'>
                            <xsl:text>ZDSC_SERIAL_INNER000</xsl:text>
                        </xsl:element>
                        <xsl:element name = 'ns3:EXIDV'>
                            <xsl:value-of select="$InnerSerialID"/>
                        </xsl:element>
                    </xsl:element>
                        <xsl:for-each select="//SERIALS[(Inner_Serial=$InnerSerialID) and (Master_Serial=$MasterID)]">
                            <xsl:element name = 'ns3:ZDSC_SERIAL_DETAILS000'>
                                <xsl:element name = 'ns3:DATAHEADERCOLUMN_SEGNAM'>
                                    <xsl:text>ZDSC_SERIAL_DETAILS000</xsl:text>
                                </xsl:element>
                                <xsl:element name = 'ns3:MATNR'>
                                    <xsl:value-of select=".//Item/text()"/>
                                </xsl:element>
                                <xsl:element name = 'ns3:SERNR'>
                                    <xsl:value-of select=".//Serial/text()"/>
                                </xsl:element>
                                <xsl:element name = 'ns3:ZZ_HDW_VERSION'>
                                    <xsl:value-of select=".//FW_Ver/text()"/>
                                </xsl:element>
                                <xsl:element name = 'ns3:ZZ_SW_VERSION'>
                                    <xsl:value-of select=".//HW_Ver/text()"/>
                                </xsl:element>
                                <xsl:element name = 'ns3:ZZ_MAC_ADDRESS'>
                                    <xsl:value-of select=".//MAC_ID/text()"/>
                                </xsl:element>
                                <xsl:element name = 'ns3:ZZ_MANF_DATE'>
                                    <xsl:value-of select=".//Mfg_date/text()"/>
                                </xsl:element>
                            </xsl:element>
                        </xsl:for-each>
                    </xsl:element>
                </xsl:when>
                <xsl:otherwise>
                    <xsl:call-template name="Inner">
                        <xsl:with-param name="InnerID">
                            <xsl:value-of select=".//Inner_Serial/text()"/>
                        </xsl:with-param>
                    </xsl:call-template>
                </xsl:otherwise>
            </xsl:choose>
        </xsl:for-each>
    </xsl:element>
</xsl:template>
<xsl:template name="Inner">
    <xsl:param name="InnerID"/>
    <xsl:element name = 'ns3:ZDSC_SERIAL_INNER000GRP'>
        <xsl:element name = 'ns3:ZDSC_SERIAL_INNER000'>
            <xsl:element name = 'ns3:DATAHEADERCOLUMN_SEGNAM'>
                <xsl:text>ZDSC_SERIAL_INNER000</xsl:text>
            </xsl:element>
            <xsl:element name = 'ns3:EXIDV'>
                <xsl:value-of select="$InnerID"/>
            </xsl:element>
        </xsl:element>
        <xsl:for-each select="//SERIALS[(Inner_Serial=$InnerID) and not(Inner_Serial=preceding-sibling::SERIALS/Inner_Serial)]">
            <xsl:call-template name="InnerSerial">
                <xsl:with-param name="InnerSerialID">
                    <xsl:value-of select=".//Inner_Serial/text()"/>
                </xsl:with-param>
            </xsl:call-template>
        </xsl:for-each>
    </xsl:element>
</xsl:template>
<xsl:template name="InnerSerial">
    <xsl:param name="InnerSerialID"/>
        <xsl:for-each select="//SERIALS[(Inner_Serial=$InnerSerialID)]">
            <xsl:element name = 'ns3:ZDSC_SERIAL_DETAILS000'>
                <xsl:element name = 'ns3:DATAHEADERCOLUMN_SEGNAM'>
                    <xsl:text>ZDSC_SERIAL_DETAILS000</xsl:text>
                </xsl:element>
                <xsl:element name = 'ns3:MATNR'>
                    <xsl:value-of select=".//Item/text()"/>
                </xsl:element>
                <xsl:element name = 'ns3:SERNR'>
                    <xsl:value-of select=".//Serial/text()"/>
                </xsl:element>
                <xsl:element name = 'ns3:ZZ_HDW_VERSION'>
                    <xsl:value-of select=".//FW_Ver/text()"/>
                </xsl:element>
                <xsl:element name = 'ns3:ZZ_SW_VERSION'>
                    <xsl:value-of select=".//HW_Ver/text()"/>
                </xsl:element>
                <xsl:element name = 'ns3:ZZ_MAC_ADDRESS'>
                    <xsl:value-of select=".//MAC_ID/text()"/>
                </xsl:element>
                <xsl:element name = 'ns3:ZZ_MANF_DATE'>
                    <xsl:value-of select=".//Mfg_date/text()"/>
                </xsl:element>
            </xsl:element>
        </xsl:for-each>
</xsl:template> 
</xsl:stylesheet>

预期的输出XML

<?xml version="1.0" encoding="UTF-8"?>
<ZDSC_SERIAL_PACK>
   <IDOC BEGIN="">
      <EDI_DC40 SEGMENT="">
         <TABNAM>EDI_DC40</TABNAM>
         <MANDT>400</MANDT>
         <DOCNUM/>
         <DOCREL/>
         <STATUS/>
         <DIRECT/>
         <OUTMOD/>
         <EXPRSS/>
         <TEST/>
         <IDOCTYP>ZDSC_SERIAL_PACK</IDOCTYP>
         <CIMTYP/>
         <MESTYP>ZDSC_SERIAL</MESTYP>
         <MESCOD>VNT</MESCOD>
         <MESFCT/>
         <STD/>
         <STDVRS/>
         <STDMES/>
         <SNDPOR></SNDPOR>
         <SNDPRT></SNDPRT>
         <SNDPFC/>
         <SNDPRN></SNDPRN>
         <SNDSAD/>
         <SNDLAD/>
         <RCVPOR></RCVPOR>
         <RCVPRT>YY</RCVPRT>
         <RCVPFC>YY</RCVPFC>
         <RCVPRN>XXXX</RCVPRN>
         <RCVSAD/>
         <RCVLAD/>
         <CREDAT/>
         <CRETIM/>
         <REFINT/>
         <REFGRP/>
         <REFMES/>
         <ARCKEY/>
         <SERIAL/>
      </EDI_DC40>
      <ZDSC_SERIAL_DOC_HEAD SEGMENT="">
         <EBELN>$1</EBELN>
         <VBELN></VBELN>
         <ZDSC_SERIAL_PALLET SEGMENT="">
            <EXIDV>123456</EXIDV>
            <ZDSC_SERIAL_MASTER SEGMENT="">
               <EXIDV>123456789</EXIDV>
               <ZDSC_SERIAL_INNER SEGMENT="">
                  <EXIDV>$</EXIDV>
                  <ZDSC_SERIAL_DETAILS SEGMENT="">
                     <MATNR>500325</MATNR>
                     <SERNR>00001</SERNR>
                     <ZZ_HDW_VERSION>S2</ZZ_HDW_VERSION>
                     <ZZ_SW_VERSION>3400015513</ZZ_SW_VERSION>
                     <ZZ_MAC_ADDRESS>$</ZZ_MAC_ADDRESS>
                     <ZZ_MANF_DATE>20190208</ZZ_MANF_DATE>
                  </ZDSC_SERIAL_DETAILS>
                  <ZDSC_SERIAL_DETAILS SEGMENT="">
                     <MATNR>500325</MATNR>
                     <SERNR>00002</SERNR>
                     <ZZ_HDW_VERSION>1</ZZ_HDW_VERSION>
                     <ZZ_SW_VERSION>3400015513</ZZ_SW_VERSION>
                     <ZZ_MAC_ADDRESS>$</ZZ_MAC_ADDRESS>
                     <ZZ_MANF_DATE>20190208</ZZ_MANF_DATE>
                  </ZDSC_SERIAL_DETAILS>
               </ZDSC_SERIAL_INNER>
            </ZDSC_SERIAL_MASTER>
         </ZDSC_SERIAL_PALLET>
      </ZDSC_SERIAL_DOC_HEAD>
   </IDOC>
</ZDSC_SERIAL_PACK>

2 个答案:

答案 0 :(得分:1)

某些名称空间应在XML和XSLT端声明,如下所示。这里的命名空间是ns0,ns1,ns3。

XML:

XSLT中:

添加身份模板:

<xsl:template match="@*|node()">
    <xsl:copy><xsl:apply-templates select="@*|node()"/></xsl:copy>
</xsl:template>

之后的XSLT中放置这样的内容。

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:ns3="www.mynamespace1.com" xmlns:ns1="www.mynamespace1.com"  xmlns:ns0="www.mynamespace1.com">

<xsl:template match="@*|node()"><!--identity template -->
    <xsl:copy><xsl:apply-templates select="@*|node()"/></xsl:copy>
</xsl:template>
.
.<!--Rest of your code as is copy here-->
.
</xsl:stylesheet>

答案 1 :(得分:1)

您的样式表有5个命名模板。没有调用任何这些模板的模板-因此将不会执行任何模板。

此外,您的样式表会出错,因为它使用前缀而不将其绑定到名称空间。

此外,您的XML缺少结束</serials>标记。

恐怕在不知道您要实现的目标的情况下,还有很多其他事情可以说。但是请注意,使用literal result elements而不是xsl:element可以大大缩短代码。