XSL-тест, если указанное значение не существует в цикле, и показывает результат один раз

#xml #xslt #xslt-1.0

#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’:

 <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">
                        amp;#x0A;EXIST~YES
                        </xsl:when>
                    </xsl:choose>
                </xsl:when>
                </xsl:choose>
            </xsl:if>
        </xsl:if>

</xsl:for-each>
 

Мне нужна ваша помощь, чтобы отобразить тег EXIST~NO на случай, если [Name=’OPACITY’ и Value=’BLACK’] существуют не во всех строках. на самом деле, когда я использую блок «иначе» внутри for-each, он отображает EXIST ~ NO несколько раз (каждый раз, когда значение не равно ЧЕРНОМУ).

большое спасибо за вашу помощь,

вот сгенерированный 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. Ваш XSLT не совсем соответствует вашему XML. Вы XSLT ищете result row элементы and , но в вашем XML у вас, похоже, есть SearchResults Object элементы and .

2. На самом деле, я выполнил экспорт в формате XML результата моего запроса. xsl выполняется, когда я выполняю запрос (QML-запрос). следовательно, цикл использует «/QueryResult / result/ child::row» и проверяет значения строка за строкой. есть ли у вас какие-либо идеи о том, как можно отобразить EXIST ~ NO один раз, если значение BLACK не существует во всех строках? большое спасибо за вашу помощь.

3. Нам действительно нужно увидеть образец фактического XML, который вводится в XSLT; тот row , в котором указаны элементы. Спасибо!

4. Я добавил xml, сгенерированный в конце моего первого сообщения, поскольку он содержит несколько строк. пожалуйста, имейте в виду, что результатом может быть более 5 строк. большое спасибо!

5. Я обновил свой ответ, чтобы учесть соответствующий XML.

Ответ №1:

Исходя из вашего XML, если вы хотите вывести «EXIST ~ YES», если был хотя бы один row с Name = ‘OPACITY’ и Value =’BLACK’, или «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

Комментарии:

1. На самом деле, я выполнил экспорт результата поиска в формате xml. Однако xsl основан на результате запроса (QML-запрос). когда я выполняю запрос, система выполняет код xsl. следовательно, использование этого способа зацикливания результата запроса: <xsl:for-each select=»/QueryResult/result/child::row»>. использование test=»Object[Attribute=’OPACITY’ и Attribute=’BLACK’]» для меня не сработало. Большое спасибо за вашу помощь.

2. Спасибо. это работает, когда мы помещаем его в шаблон, где match=»/» . Однако у меня уже есть тот же шаблон, в котором я вызываю другие шаблоны: <xsl:template match=»/»> <xsl:choose> <xsl:when test=»QueryResult/result[строка]»> <xsl:apply-templates /> </xsl:when><xsl: иначе> Не определено </xsl: иначе> </xsl:выбрать> <xsl:текст> amp;#x0A; </xsl:текст> <xsl: текст> amp; #x0A; </xsl: текст> </xsl:шаблон> . есть ли способпоместить обработку в существующий шаблон с match=»Name»?

3. Измените тест на <xsl:when test="/queryResult/result/row[Name='OPACITY' and Value='BLACdK']">EXIST~YES</xsl:when> . Тогда это будет работать независимо от того, в каком шаблоне вы находитесь.