xslt检查子节点是否以2个值的组合退出

问题描述

我想知道是否有任何订单节点的条件ID为!= -1且状态为Active或Done。 有关详细信息,请参见下面的输入和输出

示例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>标签),因为没有订单节点匹配id!= -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>

解决方法

对于示例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>