Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/12.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
Xml XSL模型:添加过滤器_Xml_Xslt - Fatal编程技术网

Xml XSL模型:添加过滤器

Xml XSL模型:添加过滤器,xml,xslt,Xml,Xslt,我使用这个漂亮的XSL模型,除其他外,它允许我缩短元素中的值 <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模型,除其他外,它允许我缩短
元素中的值

<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文件导入Access文件,它工作得非常好。 我想要的是只导入
元素上以“ABC”开头的XML

<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示例:

<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>

基础知识
700
25小时
40/ZS STAT=20
P167124/ZS ITNO=MJ63-51
1A001A/ZS SPE3=
/ZS-FRE3=
0/ZS UNN=
/ZS HAC1=
/ZS HAC2=
AQAAAA/ZS ITGR=AQAAAA
/ZS SPE5=
40169300/ZS CSNO=
UN/ZS UNMS=P
德夫
70025H
40/ZS STAT=20
P167135/ZS ITNO=
/ZS SPE3=
/ZS-FRE3=
0/ZS UNN=
/ZS HAC1=
/ZS HAC2=
AQGAAA/ZS ITGR=AQAAAA
/ZS SPE5=
/ZS CSNO=
UN/ZS UNMS=P


感谢大家:)

您可以在模板中使用
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”开头,请尝试使用此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>


谢谢!我似乎在工作,但当我导入ACCESS数据库时,模型也会导入不以“ABC”开头的录制。我想要的是,我只导入实际以“ABC”开头的XML T。再次感谢。恐怕我对导入Microsoft Access一无所知。如果XSLT为您提供了预期的输出,那么很遗憾,我不能再提供任何建议了。我明白了。我不是一个使用XSL的专家,但我看到了一些类似“选择”的函数。你觉得怎么样?再次感谢您。如果您编辑您的问题以显示您的XML示例和您期望的输出,可能会有所帮助。谢谢@Hich-我现在扩展了我的答案。你能在问题中添加XML作为文本而不是图像,因为这样可以更容易地复制到测试中。您不需要添加整个XML。只需一个带有两个
记录
元素的示例即可。谢谢完成!谢谢蒂姆的帮助,你太棒了!