XSLT裹元素XML
问题描述:
我想用XSLT来包装以下XML的一些元素,但我不能让它按预期工作:XSLT裹元素XML
<dataroot xmlns:od="urn:schemas-microsoft-com:officedata" generated="2017-04-10T18:28:30">
<qryXMLOrders>
<IteNumGDS7>1</IteNumGDS7>
<GooDesGDS23>Data</GooDesGDS23>
<GroMasGDS46>0.046</GroMasGDS46>
<NetMasGDS48>0.01</NetMasGDS48>
<ProReqGDI1>10</ProReqGDI1>
<PreProGDI1>00</PreProGDI1>
<ComNatProGIM1>000</ComNatProGIM1>
<StaValAmoGDI1>13.87</StaValAmoGDI1>
<PreDocTypAR21>380</PreDocTypAR21>
<PreDocRefAR26>6471</PreDocRefAR26>
<PreDocCatPREADMREF21>Z</PreDocCatPREADMREF21>
<DocTypDC21>N380</DocTypDC21>
<DocRefDC23>6471</DocRefDC23>
<DocTypDC21A>Y900</DocTypDC21A>
<DocRefDC23A>-</DocRefDC23A>
<DocTypDC21B>Y922</DocTypDC21B>
<DocRefDC23B>-</DocRefDC23B>
<ComNomCMD1>71171900</ComNomCMD1>
<TARCodCMD1>00</TARCodCMD1>
<TARFirAddCodCMD1>0000</TARFirAddCodCMD1>
<TARSecAddCodCMD1>0000</TARSecAddCodCMD1>
<NAtAddCodCMD1>0000</NAtAddCodCMD1>
<NamCE27>Ruthh</NamCE27>
<StrAndNumCE222>9738 SW 94 Terr</StrAndNumCE222>
<PosCodCE223>33176</PosCodCE223>
<CitCE224>Miami</CitCE224>
<CouCE225>US</CouCE225>
<NADLNGGICE>EN</NADLNGGICE>
<MarNumOfPacGS21>RE11628425179GR</MarNumOfPacGS21>
<KinOfPacGS23>EN</KinOfPacGS23>
<NumOfPacGS24>1</NumOfPacGS24>
<InvoiceDate>2017-04-07T00:00:00</InvoiceDate>
<Order_x0020_ID>1184077028</Order_x0020_ID>
</qryXMLOrders>
</dataroot>
所以最终的XML看起来是这样的:
<dataroot xmlns:od="urn:schemas-microsoft-com:officedata" generated="2017-04-10T18:28:30">
<qryXMLOrders>
<IteNumGDS7>1</IteNumGDS7>
<GooDesGDS23>Data</GooDesGDS23>
<GroMasGDS46>0.046</GroMasGDS46>
<NetMasGDS48>0.01</NetMasGDS48>
<ProReqGDI1>10</ProReqGDI1>
<PreProGDI1>00</PreProGDI1>
<ComNatProGIM1>000</ComNatProGIM1>
<StaValAmoGDI1>13.87</StaValAmoGDI1>
<PREADMREFAR2>
<PreDocTypAR21>380</PreDocTypAR21>
<PreDocRefAR26>6471</PreDocRefAR26>
<PreDocCatPREADMREF21>Z</PreDocCatPREADMREF21>
</PREADMREFAR2>
<DocTypDC21>N380</DocTypDC21>
<DocRefDC23>6471</DocRefDC23>
<DocTypDC21A>Y900</DocTypDC21A>
<DocRefDC23A>-</DocRefDC23A>
<DocTypDC21B>Y922</DocTypDC21B>
<DocRefDC23B>-</DocRefDC23B>
<COMCODGODITM>
<ComNomCMD1>71171900</ComNomCMD1>
<TARCodCMD1>00</TARCodCMD1>
<TARFirAddCodCMD1>0000</TARFirAddCodCMD1>
<TARSecAddCodCMD1>0000</TARSecAddCodCMD1>
<NAtAddCodCMD1>0000</NAtAddCodCMD1>
</COMCODGODITM>
<TRACONCE2>
<NamCE27>Ruthh</NamCE27>
<StrAndNumCE222>9738 SW 94 Terr</StrAndNumCE222>
<PosCodCE223>33176</PosCodCE223>
<CitCE224>Miami</CitCE224>
<CouCE225>US</CouCE225>
<NADLNGGICE>EN</NADLNGGICE>
</TRACONCE2>
<PACGS2>
<MarNumOfPacGS21>RE11628425179GR</MarNumOfPacGS21>
<KinOfPacGS23>EN</KinOfPacGS23>
<NumOfPacGS24>1</NumOfPacGS24>
</PACGS2>
<InvoiceDate>2017-04-07T00:00:00</InvoiceDate>
<Order_x0020_ID>1184077028</Order_x0020_ID>
</qryXMLOrders>
</dataroot>
我用下面的XSLT,但与我的元素在XML中出现两次,一次解开,然后包装成预期:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes" omit-xml-declaration="yes" />
<xsl:strip-space elements="*"/>
<!-- identity rule Copy all elements and attributes from the source to the target-->
<xsl:template match="@*|node()" name="identity">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<!-- Wrap Element -->
<xsl:template match="/dataroot/qryXMLOrders">
<xsl:copy>
<xsl:apply-templates select="PreDocTypAR21|ComNomCMD1|NamCE27|MarNumOfPacGS21/preceding-sibling::*"/>
<PREADMREFAR2>
<xsl:apply-templates select="PreDocTypAR21|PreDocRefAR26|PreDocCatPREADMREF21"/>
</PREADMREFAR2>
<COMCODGODITM>
<xsl:apply-templates select="ComNomCMD1|TARCodCMD1|TARFirAddCodCMD1|TARSecAddCodCMD1|NAtAddCodCMD1"/>
</COMCODGODITM>
<TRACONCE2>
<xsl:apply-templates select="NamCE27|StrAndNumCE222|PosCodCE223|CitCE224|CouCE225|NADLNGGICE"/>
</TRACONCE2>
<PACGS2>
<xsl:apply-templates select="MarNumOfPacGS21|KinOfPacGS23|NumOfPacGS24"/>
</PACGS2>
<xsl:apply-templates select="PreDocCatPREADMREF21|NAtAddCodCMD1|NADLNGGICE|NumOfPacGS24/following-sibling::*"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
答
您apply-templates
在MarNumOfPacGS21/preceding-sibling::*
,其中包含您的基本节点,在xsl:copy
的末尾也是如此。
默认模板复制的节点,所以,如果你不想失去的时间改变XSL的逻辑,只是做一个模板比将跳过不必要的节点:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes" omit-xml-declaration="yes" />
<xsl:strip-space elements="*"/>
<!-- identity rule Copy all elements and attributes from the source to the target-->
<xsl:template match="@*|node()" name="identity">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<!-- Wrap Element -->
<xsl:template match="/dataroot/qryXMLOrders">
<xsl:copy>
<xsl:apply-templates select="PreDocTypAR21|ComNomCMD1|NamCE27|MarNumOfPacGS21/preceding-sibling::*" mode="copy-if-needed"/>
<PREADMREFAR2>
<xsl:apply-templates select="PreDocTypAR21|PreDocRefAR26|PreDocCatPREADMREF21"/>
</PREADMREFAR2>
<COMCODGODITM>
<xsl:apply-templates select="ComNomCMD1|TARCodCMD1|TARFirAddCodCMD1|TARSecAddCodCMD1|NAtAddCodCMD1"/>
</COMCODGODITM>
<TRACONCE2>
<xsl:apply-templates select="NamCE27|StrAndNumCE222|PosCodCE223|CitCE224|CouCE225|NADLNGGICE"/>
</TRACONCE2>
<PACGS2>
<xsl:apply-templates select="MarNumOfPacGS21|KinOfPacGS23|NumOfPacGS24"/>
</PACGS2>
<xsl:apply-templates select="PreDocCatPREADMREF21|NAtAddCodCMD1|NADLNGGICE|NumOfPacGS24/following-sibling::*" mode="copy-if-needed"/>
</xsl:copy>
</xsl:template>
<xsl:template match="PreDocTypAR21|PreDocRefAR26|PreDocCatPREADMREF21|ComNomCMD1|TARCodCMD1|TARFirAddCodCMD1|TARSecAddCodCMD1|NAtAddCodCMD1|NamCE27|StrAndNumCE222|PosCodCE223|CitCE224|CouCE225|NADLNGGICE|MarNumOfPacGS21|KinOfPacGS23|NumOfPacGS24" mode="copy-if-needed">
<!-- Do nothing, skip these nodes -->
</xsl:template>
<xsl:template match="*" mode="copy-if-needed">
<!-- Copy (apply default template) -->
<xsl:apply-templates select="current()"/>
</xsl:template>
</xsl:stylesheet>
未经检验的,但你应该明白了。
+0
是的,它的工作原理!非常感谢@ Xenos –
如果你打算发布[你自己的问题]的副本(http://*.com/questions/43328721/wrap-elements-in-xml-using-xslt),那么请至少有正派删除原文。 –