xslt проверяет, завершаются ли дочерние узлы с комбинацией из 2 значений

#xml #xslt #xslt-1.0 #transformation

#xml #xslt #xslt-1.0 #преобразование

Вопрос:

Я хочу знать, есть ли какие-либо узлы заказа с идентификатором критерия!= -1 и статусом = Активный или выполненный. Смотрите ниже входы и выходы для получения подробной информации

Пример 1

 <order-request>
 <orders>
    <order>
      <name>John</name>
      <id>1</id>
      <status>Done</id>
    </order>
    <order>
      <name>Smith</name>
      <id>-1</id>
      <status>Pending</id>
    </order>
 </orders>
</order-request>
  

ВЫВОД для вышеуказанного xml должен быть

 <orders-list>
 <order>
      <name>John</name>
      <id>1</id>
      <status>Done</id>
 </order>
</orders-list>
  

Пример 2

 <order-request>
 <orders>
    <order>
      <name>John</name>
      <id>-1</id>
      <status>Done</id>
    </order>
    <order>
      <name>Smith</name>
      <id>456</id>
      <status>Pending</id>
    </order>
 </orders>
</order-request>
  

ВЫВОД
Я должен получить пустой ответ от xslt (также я не должен получать <orders-list> тег), потому что нет соответствующего идентификатора узла заказа! = -1 и статус активен или Выполнен

Мой xslt не работает с вводом примера 2
Например, 2 Я получаю вывод, так как <orders-list> </order-list> я должен получить пустой ответ. Я не хочу <order-list> тег без дочернего элемента.

 <xsl:stylesheet>
 <xsl:template match="order-request">
        <xsl:if
            test="(orders/order/id[.!= -1]) and ((orders/order/status[.='Active']) or 
 orders/order/status[.='Done']))">
                    <orders-list>
                        <xsl:apply-templates
                            select="order"></xsl:apply-templates>
                    </orders-list>
            </xsl:if>
    </xsl:template>

   <xsl:template match="order">
     <xsl:if test="(id != -1) and (status ='Active' or status ='Done')">
        <order>
          <name><xsl:value-of select="name" /></name>
          <id><xsl:value-of select="id" /></id>
          <status><xsl:value-of select="status'" /></status>
        </order>
     </xsl:if>
    </xsl:template>
</xsl:stylesheet>
  

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

1. Код в вашем вопросе предназначен для того, чтобы позволить нам воспроизвести вашу проблему и найти решение. Когда вы публикуете неаккуратный код, полный подобных ошибок, вы тратите время людей, которые пытаются вам помочь. Пожалуйста, имейте это в виду в следующий раз.

Ответ №1:

Например, 2 я получаю вывод в виде <orders-list> </order-list>

Все, что я получаю с вашим кодом, — это множественные ошибки. Например:

 <status><xsl:value-of select="status'" /></id>
  

неправильно сформированный XML.

Как насчет чего-то простого:

XSLT 1.0

 <xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>

<xsl:template match="/order-request">
    <xsl:variable name="eligible-orders" select="orders/order[id=1 and (status ='Active' or status ='Done')]" />
    <xsl:if test="$eligible-orders">
        <orders-list>
            <xsl:copy-of select="$eligible-orders"/>
        </orders-list> 
    </xsl:if>
</xsl:template>

</xsl:stylesheet>