Модель XSL: Добавить фильтр на - PullRequest
0 голосов
/ 21 мая 2018

Я использую эту прекрасную модель 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 вДоступ к файлам, и это работает отлично.Я хочу импортировать только тот XML, который начинается с «ABC» в элементе <FLAG>.

Вот пример используемого мной 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>

XMLфайл

Спасибо вам, ребята:)

1 Ответ

0 голосов
/ 21 мая 2018

Вы можете использовать функцию 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>

В качестве альтернативы, добавьте второй шаблон, чтобы игнорировать FLAG элементы, которые не начинаются с "ABC"

<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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...