我使用这个漂亮的XSL模型,它允许我,除其他外,缩短<FLAG>元素中的值。
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="ZBE14_OEMs_ItemUpdate_OUT/Record/ItemMaster/FLAG">
<xsl:copy>
<xsl:apply-templates select="@*" />
<xsl:value-of select="substring(normalize-space(), 1, 19)"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>我使用这个模型将大量的XML文件导入到访问文件中,并且它工作得非常完美。我只想导入<FLAG>元素上以"ABC“开头的XML。
下面是我使用的XML示例:
<ZBE14_OEMs_ItemUpdate_OUT>
<Record>
<ItemMaster>
<FLAG>ABC</FLAG>
<CONO>700</CONO>
<WHLO>25H</WHLO>
<STAT>40 / ZS STAT=20</STAT>
<ITNO>P167124 / ZS ITNO=MJ63-51</ITNO>
<SPE3>1A001A / ZS SPE3=</SPE3>
<FRE3> / ZS FRE3=</FRE3>
<UNNN>0 / ZS UNNN=</UNNN>
<HAC1> / ZS HAC1=</HAC1>
<HAC2> / ZS HAC2=</HAC2>
<ITGR>AQAAAA / ZS ITGR=AQAAAA</ITGR>
<SPE5> / ZS SPE5=</SPE5>
<CSNO>40169300 / ZS CSNO=</CSNO>
<UNMS>UN / ZS UNMS=P</UNMS>
</ItemMaster>
</Record>
<Record>
<ItemMaster><FLAG>DEFGH</FLAG>
<CONO>700</CONO><WHLO>25H</WHLO>
<STAT>40 / ZS STAT=20</STAT>
<ITNO>P167135 / ZS ITNO=</ITNO>
<SPE3> / ZS SPE3=</SPE3>
<FRE3> / ZS FRE3=</FRE3>
<UNNN>0 / ZS UNNN=</UNNN>
<HAC1> / ZS HAC1=</HAC1>
<HAC2> / ZS HAC2=</HAC2>
<ITGR>AQGAAA / ZS ITGR=AQAAAA</ITGR>
<SPE5> / ZS SPE5=</SPE5>
<CSNO> / ZS CSNO=</CSNO>
<UNMS>UN / ZS UNMS=P</UNMS>
</ItemMaster>
</Record>
</ZBE14_OEMs_ItemUpdate_OUT>感谢你们:)
发布于 2018-05-21 09:03:24
您可以在模板中使用start-with函数。
<xsl:template match="ZBE14_OEMs_ItemUpdate_OUT/Record/ItemMaster/FLAG">
<xsl:if test="starts-with(normalize-space(), 'ABC')">
<xsl:copy>
<xsl:apply-templates select="@*" />
<xsl:value-of select="substring(normalize-space(), 1, 19)"/>
</xsl:copy>
</xsl:if>
</xsl:template>或者,添加第二个模板来忽略不以"ABC“开头的FLAG元素
<xsl:template match="ZBE14_OEMs_ItemUpdate_OUT/Record/ItemMaster/FLAG[not(starts-with(normalize-space(), 'ABC'))]" priority="2" />
<xsl:template match="ZBE14_OEMs_ItemUpdate_OUT/Record/ItemMaster/FLAG">
<xsl:copy>
<xsl:apply-templates select="@*" />
<xsl:value-of select="substring(normalize-space(), 1, 19)"/>
</xsl:copy>
</xsl:template>注意,为了避免模板冲突,需要优先级,其中两个模板匹配相同的元素和相同的优先级。
编辑:我想我可能误解了这个问题。如果您不想导入Record元素,而FLAG不以"ABC“开头,那么请尝试以下XSLT
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="ZBE14_OEMs_ItemUpdate_OUT/Record[not(starts-with(normalize-space(ItemMaster/FLAG), 'ABC'))]" />
<xsl:template match="ZBE14_OEMs_ItemUpdate_OUT/Record/ItemMaster/FLAG">
<xsl:copy>
<xsl:apply-templates select="@*" />
<xsl:value-of select="substring(normalize-space(), 1, 19)"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>https://stackoverflow.com/questions/50445196
复制相似问题