#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>
. Тогда это будет работать независимо от того, в каком шаблоне вы находитесь.