首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >检查XSLT1.0中是否至少有一个子级的特定值

检查XSLT1.0中是否至少有一个子级的特定值
EN

Stack Overflow用户
提问于 2014-10-08 09:26:12
回答 2查看 1.4K关注 0票数 0

这是我的XML:

代码语言:javascript
运行
复制
<LIGHT_INFORMATION_LIST>
    <LIGHT_INFORMATION>
        <LIGHT_CHARACTERISTICS>Al</LIGHT_CHARACTERISTICS>
        <LIGHT_COLOUR>W-G</LIGHT_COLOUR>
    </LIGHT_INFORMATION>
    <LIGHT_INFORMATION>
        <LIGHT_CHARACTERISTICS>Al</LIGHT_CHARACTERISTICS>
        <LIGHT_COLOUR>W-R</LIGHT_COLOUR>
    </LIGHT_INFORMATION>
    <LIGHT_INFORMATION>
        <LIGHT_CHARACTERISTICS>F</LIGHT_CHARACTERISTICS>
        <LIGHT_COLOUR>R</LIGHT_COLOUR>
    </LIGHT_INFORMATION>
    <LIGHT_INFORMATION>
        <LIGHT_CHARACTERISTICS>F</LIGHT_CHARACTERISTICS>
        <LIGHT_COLOUR>G</LIGHT_COLOUR>
    </LIGHT_INFORMATION>
    <LIGHT_INFORMATION>
        <LIGHT_CHARACTERISTICS>F</LIGHT_CHARACTERISTICS>
        <LIGHT_COLOUR>W</LIGHT_COLOUR>
    </LIGHT_INFORMATION>
</LIGHT_INFORMATION_LIST>

我将插入一个控件:

如果这个LIGHT_COLOUR中至少有一个LIGHT_INFORMATION_LIST元素包含'-‘

我试过了,但完全错了

代码语言:javascript
运行
复制
<xsl:choose>
    <xsl:when test="not(contains(.,'-'))">
        <!-- do A -->  
    </xsl:when>    
    <xsl:otherwise>
        <!-- do B -->
    </xsl:otherwise>
</xsl:choose>

这实际上是我的XSLT代码:

代码语言:javascript
运行
复制
<xsl:for-each select="LIGHT_INFORMATION">
    <xsl:for-each select="LIGHT_COLOUR">
        <xsl:choose>
            <xsl:when test="not(contains(.,'-'))"> <!-- This is the test Required -->
                <xsl:choose>
                    <xsl:when test="following-sibling::LIGHT_RANGE >= 15">
                        <span style="font-family:Univers Condensed; font-weight:bold;">
                            <xsl:if test="not(preceding::LIGHT_COLOUR[1][preceding::IMMUTABLE_ID = $EF])">
                                <xsl:value-of select="."/>
                            </xsl:if>
                            <xsl:if test=". != preceding::LIGHT_COLOUR[1][preceding::IMMUTABLE_ID = $EF]">
                                <xsl:value-of select="."/>
                            </xsl:if>
                        </span> 
                    </xsl:when> 
                    <xsl:otherwise>
                        <xsl:if test="not(preceding::LIGHT_COLOUR[1][preceding::IMMUTABLE_ID = $EF])">
                            <xsl:value-of select="."/>
                        </xsl:if>
                        <xsl:if test=". != preceding::LIGHT_COLOUR[1][preceding::IMMUTABLE_ID = $EF]">
                            <xsl:value-of select="."/>
                        </xsl:if>
                    </xsl:otherwise>
                </xsl:choose>
            </xsl:when>
            <xsl:otherwise>
            ciao <!-- I would insert this control here if LIGHT_COLOUR contain '-' -->
            </xsl:otherwise>
        </xsl:choose>
    </xsl:for-each> 
</xsl:for-each> 

现在的输出是:

乔乔R、G、W

如果LIGHT_INFORMATION_LIST的这个节点中只有一个元素包含在LIGHT_COLOUR中-‘写'Ciao’,我会这么做的

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-10-09 08:08:19

Thi是解决方案:

代码语言:javascript
运行
复制
<xsl:for-each select="LIGHT_INFORMATION">
    <xsl:choose>
        <xsl:when test="not(contains(parent::LIGHT_INFORMATION_LIST//LIGHT_COLOUR, '-'))"> <!-- This is the solution -->
            <xsl:for-each select="LIGHT_COLOUR">
                <xsl:choose>
                    <xsl:when test="following-sibling::LIGHT_RANGE >= 15">
                        <span style="font-family:Univers Condensed; font-weight:bold;">
                            <xsl:if test="not(preceding::LIGHT_COLOUR[1][preceding::IMMUTABLE_ID = $EF])">
                                <xsl:value-of select="."/>
                            </xsl:if>
                            <xsl:if test=". != preceding::LIGHT_COLOUR[1][preceding::IMMUTABLE_ID = $EF]">
                                <xsl:value-of select="."/>
                            </xsl:if>
                        </span> 
                    </xsl:when> 
                    <xsl:otherwise>
                        <xsl:if test="not(preceding::LIGHT_COLOUR[1][preceding::IMMUTABLE_ID = $EF])">
                            <xsl:value-of select="."/>
                        </xsl:if>
                        <xsl:if test=". != preceding::LIGHT_COLOUR[1][preceding::IMMUTABLE_ID = $EF]">
                            <xsl:value-of select="."/>
                        </xsl:if>
                    </xsl:otherwise>
                </xsl:choose>       
            </xsl:for-each> 
        </xsl:when>
        <xsl:otherwise>
        Ciao
        </xsl:otherwise>
    </xsl:choose>
</xsl:for-each> 

在头部插入控件并使用父控件。

票数 0
EN

Stack Overflow用户

发布于 2014-10-08 10:06:41

后续同胞只有在同一级别上才能找到LIGHT_COLOR (即当前节点是LIGHT_CHARACTERISTIC节点,即使这样它也只能找到一个节点)。

要查看所有这些节点,需要指定包含它们的路径,无论是全局路径还是相对于当前节点的路径。在这种情况下:

代码语言:javascript
运行
复制
/LIGHT_INFORMATION_LIST/LIGHT_INFORMATION/LIGHT_COLOUR

此路径将选择所有LIGHT_COLOR节点。现在,如果每个节点不包含“-”,我们希望将其过滤掉:

代码语言:javascript
运行
复制
/LIGHT_INFORMATION_LIST/LIGHT_INFORMATION/LIGHT_COLOUR[contains(., "-")]

我们实际上对任何单个节点都不感兴趣,我们只是想知道有多少节点是这样的:

代码语言:javascript
运行
复制
count (/LIGHT_INFORMATION_LIST/LIGHT_INFORMATION/LIGHT_COLOUR[contains(., "-")])

因此,你的支票是:

代码语言:javascript
运行
复制
<xsl:when test='count (/LIGHT_INFORMATION_LIST/LIGHT_INFORMATION/LIGHT_COLOUR[contains(., "-")])'>

*编辑:修改后的问题答案*如果您想要一个控件,那么您只想做一次,所以将它移出循环:

代码语言:javascript
运行
复制
<!-- Do this where we can see all of the LIGHT_COLOR tags -->
<xsl:if test="contains(LIGHT_INFORMATION/LIGHT_COLOR, '-')">
Ciao
</xsl:if>
<xsl:for-each select="LIGHT_INFORMATION">
    <!-- as per your existing code. Remove the "otherwise" clause that is creating multiple controls. -->
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26253474

复制
相关文章

相似问题

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