Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
XSLT:找到转换为XML的方法_Xslt - Fatal编程技术网

XSLT:找到转换为XML的方法

XSLT:找到转换为XML的方法,xslt,Xslt,我有以下格式的XML: <?xml version="1.0"?> <MES_VEHICLE_STATUS_DESCRIPTOR xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="MOM.Production" PRODUCTI

我有以下格式的XML:

     <?xml version="1.0"?>
<MES_VEHICLE_STATUS_DESCRIPTOR xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="MOM.Production"  PRODUCTIONORDER="000001995795" >
  <POSECTION LOCATION="" />
  <ORDERSECTION SALESORDER=""  />
  <MATERIALCONSUMPTIONSECTION>
    <MATERIAL_CONSUMPTION DESC="car" QTY="1.000" WORKPLACE="3001_GAT101LH">BIN1000004</MATERIAL_CONSUMPTION>
    <MATERIAL_CONSUMPTION DESC="PLAIN_WASHER" QTY="1.000" WORKPLACE="3001_GAT101LH">WRE20000018</MATERIAL_CONSUMPTION>
    <MATERIAL_CONSUMPTION DESC="car" QTY="1.000" WORKPLACE="3001_GAT101LH">BIN1000003</MATERIAL_CONSUMPTION>
    
  </MATERIALCONSUMPTIONSECTION>
</MES_VEHICLE_STATUS_DESCRIPTOR>

BIN1000004
Wre2000018
BIN1000003
输出应该是这样的:

    <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
                  xmlns:mat="http://mes.com/ScrapManagement">
   <soapenv:Header/>
   <soapenv:Body>
      <mat:DT_SCRAPMANAGEMENT_MES_REQ>
         <DATA>
            <PlantCode>3002</PlantCode>
            <SAPOrder>000001995795</SAPOrder>
            <Quantity>1.000</Quantity>
            <PartNo>BIN1000004</PartNo>
            <WorkPlace>3001_GAT101LH</WorkPlace>
         </DATA>
         <DATA>
            <PlantCode>3002</PlantCode>
            <SAPOrder>000001995795</SAPOrder>
            <Quantity>1.000</Quantity>
            <PartNo>WRE20000018</PartNo>
            <WorkPlace>3001_GAT101LH</WorkPlace>
         </DATA>
         <DATA>
            <PlantCode>3002</PlantCode>
            <SAPOrder>000001995795</SAPOrder>
            <Quantity>1.000</Quantity>
            <PartNo>BIN1000003</PartNo>
            <WorkPlace>3001_GAT101LH</WorkPlace>
         </DATA>
                     
      </mat:DT_SCRAPMANAGEMENT_MES_REQ>
   </soapenv:Body>
</soapenv:Envelope>

3002
000001995795
1
BIN1000004
3001_GAT101LH
3002
000001995795
1
Wre2000018
3001_GAT101LH
3002
000001995795
1
BIN1000003
3001_GAT101LH
我要转换的XSLT

    <xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    >
    <xsl:output encoding="UTF-8" indent="yes" method="xml" version="1.0" />
    <xsl:template match="MES_VEHICLE_STATUS_DESCRIPTOR">
        <soapenv:Envelope
            xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
            xmlns:mat="http://mes.com/ScrapManagement">
            <soapenv:Header />
            <soapenv:Body>
                <xsl:element name="mat:DT_SCRAPMANAGEMENT_MES_REQ">
                    <xsl:variable name="po" select="@PRODUCTIONORDER" />
                    <xsl:for-each select="MATERIALCONSUMPTIONSECTION/MATERIAL_CONSUMPTION">
                        <DATA>
                            <PlantCode>
                                <xsl:text>3002</xsl:text>
                            </PlantCode>
                            <SAPOrder>
                                <xsl:value-of select="$po" />
                            </SAPOrder>
                            <Quantity>
                                <xsl:value-of select="@QTY" />
                            </Quantity>
                            <PartNo>
                                <xsl:value-of select="." />
                            </PartNo>
                            <WorkPlace>
                                <xsl:value-of select="@WORKPLACE" />
                            </WorkPlace>
                        </DATA>
                    </xsl:for-each>
                </xsl:element>
            </soapenv:Body>
        </soapenv:Envelope>
    </xsl:template>
</xsl:stylesheet>

3002
如果我在XML文件中删除xmlns=“MOM.Production”,转换就可以了。但如果在xml文件中有它,就不能转换。我使用网站:
https://www.online-toolz.com/tools/xslt-transformation.php
并显示错误:
错误:DOMDocument::loadXML():xmlns:URI MOM。生产在实体中不是绝对的,行:2
。 我不明白什么是原因。
我不明白原因是什么

您脑海中的代码可能或多或少是这样的:

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

  <xsl:template match="MES_VEHICLE_STATUS_DESCRIPTOR">
    <xsl:for-each select="MATERIALCONSUMPTIONSECTION/MATERIAL_CONSUMPTION">
      <xsl:element name="DATA">
        <xsl:element name="PRODUCTIONORDER">
          <xsl:value-of select="../../@PRODUCTIONORDER" />
        </xsl:element>
        <xsl:element name="QTY">
          <xsl:value-of select="@QTY" />
        </xsl:element>
        <xsl:element name="MATERIAL">
          <xsl:value-of select="text()" />
        </xsl:element>
      </xsl:element>
    </xsl:for-each>
  </xsl:template>

</xsl:stylesheet>

使用文本结果元素而不是
xsl:element
。也可以考虑使用一个变量来生产顺序,而不是从祖先No.@ Migel.HOR257K反复查找它,我完全同意。在本例中,我希望进行最小的更改以使PO的代码正常工作。我将编辑上面的解决方案。还有一个:使用
而不是在变量内创建文本节点。@michael.hor257k:我再次同意。@michael.hor257k,为什么不选择
而不是选择
text()
…请不要在问题得到回答后向其添加问题。您的新问题的解决方案可在此处找到:。
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output encoding="UTF-8" indent="yes" method="xml" version="1.0" />

  <xsl:template match="MES_VEHICLE_STATUS_DESCRIPTOR">
    <xsl:variable name="po" select="@PRODUCTIONORDER" />
    <xsl:for-each select="MATERIALCONSUMPTIONSECTION/MATERIAL_CONSUMPTION">
      <DATA>
        <PRODUCTIONORDER><xsl:value-of select="$po" /></PRODUCTIONORDER>
        <QTY><xsl:value-of select="@QTY" /></QTY>
        <MATERIAL><xsl:value-of select="." /></MATERIAL>
      </DATA>
    </xsl:for-each>
  </xsl:template>

</xsl:stylesheet>