当我尝试使用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>
答案 0 :(得分:1)
某些名称空间应在XML和XSLT端声明,如下所示。这里的命名空间是ns0,ns1,ns3。
在 XML:
在 XSLT中:
添加身份模板:
<xsl:template match="@*|node()">
<xsl:copy><xsl:apply-templates select="@*|node()"/></xsl:copy>
</xsl:template>
在
<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
可以大大缩短代码。