XSL模板匹配,然后跟随兄弟的IF条件

时间:2014-03-14 02:23:42

标签: templates xslt position match

我有以下问题。我需要知道是否在x个同名的子节点中的任何一个上满足条件,并且不处理该行。我将xml解析为文本文件,但它可能有2个或3个相同的子节点,它们被称为相同的不同值,如果其中一个符合条件,则处理该行。

这是我的XML的一部分:

<home>
    <app>
        <data>
            <rec>
                <rpos>1</rpos>
                <itemdef>
                    <item>HLK-TEST-A</item>
                    <desc>SOMETHING1</desc>
                    <ics>
                        <code>HKU</code>
                        <bpid></bpid>
                        <citem>TEST-A</citem>
                    </ics>  
                    <ics>
                        <code>HLK</code>
                        <bpid></bpid>
                        <citem>TEST-A</citem>
                    </ics>
                </itemdef>
            </rec>
            <rec>
                <rpos>2</rpos>
                <itemdef>
                    <item>HLK-TEST-B</item>
                    <desc>Test</desc>
                    <ics>
                        <code>HKU</code>
                        <bpid></bpid>
                        <citem>TEST-B</citem>
                    </ics>
                </itemdef>
            </rec>
            <rec>
                <rpos>3</rpos>
                <itemdef>
                    <item>HLK-TEST-C</item>
                    <desc>Test3</desc>
                    <ics>
                        <code>HLK</code>
                        <bpid></bpid>
                        <citem>TEST-C</citem>
                    </ics>
                </itemdef>
            </rec>
            <rec>
                <rpos>4</rpos>
                <itemdef>
                    <item>HLK-TEST-D</item>
                    <desc>SOMETHING4</desc>
                    <ics>
                        <code>HLK</code>
                        <bpid></bpid>
                        <citem>TEST-D</citem>
                    </ics>  
                    <ics>
                        <code>HKU</code>
                        <bpid></bpid>
                        <citem>TEST-D</citem>
                    </ics>
                </itemdef>
            </rec>
        </data>
    </app>
</home>

基本上记录1,3和4必须处理,因为他们有一个&#34;代码&#34;标签的值为HLK

这是我在XSLT上的内容......虽然我可以设法只获得第1和第3条记录......你能帮忙吗?

XSL:

<xsl:output method="text"/>
<xsl:strip-space elements="*"/>


<xsl:template match="home/app/data/rec[itemdef/ics[position() = last()]/code[not(starts-with(.,'HLK'))]]">
</xsl:template>

<xsl:template match="home">
    <xsl:apply-templates select="app"/>
</xsl:template>

    <xsl:template match="app">
        <xsl:apply-templates select="data"/>
    </xsl:template>

        <xsl:template match="app" mode="print">
            <xsl:text>105604|</xsl:text>
            <xsl:value-of select='date'/>
            <xsl:text>T</xsl:text>
            <xsl:value-of select='time'/>
            <xsl:text>|</xsl:text>
        </xsl:template>

            <xsl:template match="data">
                <xsl:apply-templates select="rec"/>
            </xsl:template>

                <xsl:template match="rec">
                    <xsl:apply-templates select="itemdef"/>
                </xsl:template>

                    <xsl:template match="itemdef">
                        <xsl:apply-templates select="ancestor::app" mode="print"/>
                        <xsl:value-of select='item'/><xsl:text>|</xsl:text>
                        <xsl:value-of select='desc'/><xsl:text>|</xsl:text>
                                <xsl:text>|</xsl:text>
                                <xsl:text>|&#xD;&#xA;</xsl:text>
                    </xsl:template>
</xsl:stylesheet>

这是我目前的输出:

105604|T|HLK-TEST-A|SOMETHING1|||
105604|T|HLK-TEST-C|Test3|||

但应该是:

105604|T|HLK-TEST-A|SOMETHING1|||
105604|T|HLK-TEST-C|Test3|||
105604|T|HLK-TEST-D|SOMETHING4|||

1 个答案:

答案 0 :(得分:1)

第4个rec元素正在被过滤掉,因为空rec元素上的空模板与ics元素的最后ics元素不匹配&#34; HLK& #34 ;.在您的XML中,第4个rec元素的最后一个rec元素的值为&#34; HKU&#34;,它不以&#34; HLK&#34;开头。

从示例XML看来,空模板的标准似乎应该是与itemdef/ics/code元素不匹配的position()元素,这些元素以&#34; HLK&#34;开头,无论如何ics元素的<xsl:template match="rec[not(itemdef/ics/code[starts-with(.,'HLK')])]" />

rec

或者,您可以在rec元素上一般匹配空模板,另一个匹配具有&#34; HLK&#34;的code元素。 <xsl:template match="rec" /> <xsl:template match="rec[itemdef/ics/code[starts-with(.,'HLK')]]"> <xsl:apply-templates select="itemdef"/> </xsl:template> 元素。

{{1}}