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

xslt check if child nodes exits with a combination of 2 values

我想知道是否有条件id != -1 和status = 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 并且状态是 Active 或 Done

我的 xslt 因示例 2 输入而失败
对于示例 2,我得到的输出为 <orders-list> </order-list> 我应该得到空洞的回应。我不想要没有 child.

<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>

For Example 2 I am getting output as <orders-list> </order-list>

我从你的代码中得到的只是多个错误。例如:

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

不是 well-formed 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>