首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >XSL模板匹配,然后是后续兄弟姐妹的IF条件。

XSL模板匹配,然后是后续兄弟姐妹的IF条件。
EN

Stack Overflow用户
提问于 2014-03-14 02:23:41
回答 1查看 1.1K关注 0票数 1

我有以下问题。我需要知道在同名的x个子节点上是否满足了一个条件,并且不处理行。我正在将xml解析为一个文本文件,但它可能有两个或三个相同的子节点,它们具有不同的值,如果其中一个满足条件,那么处理行。

以下是我的XML的一部分:

代码语言:javascript
复制
<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必须处理,因为它们有一个值为HLK的“代码”标记。

以下是我对XSLT的看法..。虽然我只能拿到第一和第三张唱片.你能帮忙吗?

XSL:

代码语言:javascript
复制
<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>

这是我目前的输出:

代码语言:javascript
复制
105604|T|HLK-TEST-A|SOMETHING1|||
105604|T|HLK-TEST-C|Test3|||

但应该是:

代码语言:javascript
复制
105604|T|HLK-TEST-A|SOMETHING1|||
105604|T|HLK-TEST-C|Test3|||
105604|T|HLK-TEST-D|SOMETHING4|||
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-03-14 03:32:14

第四个rec元素被过滤掉了,因为空模板匹配在rec元素上,后者是最后一个ics元素,而不是以"HLK“开头。在您的XML中,第4个ics元素的最后一个rec元素的值为"HKU",它不以"HLK“开头。

从示例XML看来,空模板的条件应该是匹配没有以"HLK“开头的rec元素,而不管ics元素的position()是什么:

代码语言:javascript
复制
<xsl:template match="rec[not(itemdef/ics/code[starts-with(.,'HLK')])]" />

或者,您可以在rec元素上进行一般的空模板匹配,而另一个匹配具有"HLK“code元素的rec元素。

代码语言:javascript
复制
<xsl:template match="rec" />

<xsl:template match="rec[itemdef/ics/code[starts-with(.,'HLK')]]">
    <xsl:apply-templates select="itemdef"/>
</xsl:template> 
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22394990

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档