XSL测试指示值是否在循环内不存在,并一次显示结果

时间:2019-04-16 10:53:30

标签: xml xslt xslt-1.0

我是xsl的新手,而且我无法获得想要的xml文件结果。这是查询结果的xml文件的一部分:

<?xml version="1.0" encoding="UTF-8"?>
-<SearchResults>
-<TableHeader>
<ColumnName>UCode</ColumnName>
<ColumnName>URev</ColumnName>
<ColumnName>Shapes</ColumnName>
<ColumnName>Name</ColumnName>
<ColumnName>Value</ColumnName>
</TableHeader>
-<Object>
<Attribute>XXXXXXX/Attribute>
<Attribute>A</Attribute>
<Attribute>BLABLA</Attribute>
<Attribute>PART_CODE</Attribute>
<Attribute>X123456</Attribute>
<Attribute/>
</Object>
-<Object>
<Attribute>YYYYYYYY/Attribute>
<Attribute>A</Attribute>
<Attribute>BLABLA</Attribute>
<Attribute>OPACITY</Attribute>
<Attribute>BLACK</Attribute>
<Attribute/>
</Object>
-<Object>
<Attribute>ZZZZZZZZ/Attribute>
<Attribute>A</Attribute>
<Attribute>BLABLA</Attribute>
<Attribute>PART_CODE</Attribute>
<Attribute>X198706</Attribute>
<Attribute/>
</Object>
-<Object>
<Attribute>XXXXXXX/Attribute>
<Attribute>A</Attribute>
<Attribute>BLABLA</Attribute>
<Attribute>OPACITY</Attribute>
<Attribute>BLACK</Attribute>
<Attribute/>
</Object>
</SearchResults>

这里是XSL上仅当我具有Name ='OPACITY'和Value ='BLACK'时才显示标签EXIST〜YES的部分:

<xsl:for-each select="/queryResult/result/child::row">  
    <xsl:variable name="attnamez" select='Name'/>
        <xsl:if test="$attnamez='OPACITY'">
            <xsl:variable name="attvaluez" select='Value'/>
            <xsl:if test="$attvaluez!='NotDefined'">
                <xsl:choose>
                <xsl:when test="$attvaluez='BLACK'">

                    <xsl:choose>
                        <xsl:when test="count(preceding::row[Name='OPACITY' and Value=$attvaluez])=0">
                        &#x0A;EXIST~YES
                        </xsl:when>
                    </xsl:choose>
                </xsl:when>
                </xsl:choose>
            </xsl:if>
        </xsl:if>

</xsl:for-each>

如果[Name ='OPACITY'和Value ='BLACK']并非在所有行中都存在,我需要您的帮助来显示标签EXIST〜NO。实际上,当我在for-each内部使用“ otherwise”块时,它多次显示EXIST〜NO(每次值都不等于BLACK)。

非常感谢您的帮助,

这是生成的xml:

 <queryResult>
 <result>
<row idx="1">
  <UCode>XXXXX</UCode> 
  <URev>B</URev> 
  <Name>OPACITY</Name> 
  <Value>WHITE</Value> 
  <SiteLegacy /> 
 </row>
<row idx="2">
  <UCode>YYYYYY</UCode> 
  <URev>B</URev> 
  <Name>OPACITY</Name> 
  <Value>BLACK</Value> 
  <SiteLegacy /> 
</row>
<row idx="3">
  <UCode>YYYYYY</UCode> 
  <URev>B</URev> 
  <Name>OPACITY</Name> 
  <Value>BLACK</Value> 
  <SiteLegacy /> 
</row>
<row idx="4">
  <UCode>YYYYYY</UCode> 
  <URev>B</URev> 
  <Name>OPACITY</Name> 
  <Value>BLACK</Value> 
  <SiteLegacy /> 
</row>
<row idx="5">
  <UCode>YYYYYY</UCode> 
  <URev>B</URev> 
  <Name>OPACITY</Name> 
  <Value>BLACK</Value> 
  <SiteLegacy /> 
</row>
  </result>
  </queryResult>

1 个答案:

答案 0 :(得分:0)

如果您要输出至少有一个row且名称='OPACITY'和Value ='BLACK'的XML,如果您想输出“ EXIST〜YES”,否则使用“ EXIST〜NO”,你可以简单地做到这一点...

<xsl:choose>
    <xsl:when test="queryResult/result/row[Name='OPACITY' and Value='BLACdK']">EXIST~YES</xsl:when>
    <xsl:otherwise>EXIST~NO</xsl:otherwise>
</xsl:choose> 

完全不需要xsl:for-each

http://xsltfiddle.liberty-development.net/bnnZWk/1上查看它的运行情况