如何根据XSLT 2.0中所有重复元素的值来做出决定

时间:2017-06-19 10:15:30

标签: xslt mapping xslt-grouping

我有以下XML输入,我想对它进行一些转换。

输入XML:

<itemDetails>
    <itemShipmentDate>2017-06-19</itemShipmentDate>
    <itemBillingDate>2017-06-15</itemBillingDate>
    <itemLines>
         <itemLine>
            <itemId>1</itemId>
            <itemQuantity>0</itemQuantity>
         </itemLine>
         <itemLine>
            <itemId>2</itemId>
            <itemQuantity>0</itemQuantity>
         </itemLine>
         <itemLine>
            <itemId>3</itemId>
            <itemQuantity>0</itemQuantity>
         </itemLine>
         <itemLine>
            <itemId>4</itemId>
            <itemQuantity>0</itemQuantity>
         </itemLine>
         <itemLine>
            <itemId>5</itemId>
            <itemQuantity>0</itemQuantity>
         </itemLine>
    </itemLines>         
</itemDetails>

问题陈述:

我想检查如果所有itemLine中的“Quantity”标签等于零,那么在输出中一个字段即“AllItemsQuantityFlag”值应为“是,如果其中一个数量标签不为零,那么输出应为“否”。 所以,有点像IF其他场景。

所以,在上面提到的输入案例中,我们将得到以下输出:

期望输出:

<OutputDetails xmlns:xs="http://www.w3.org/2001/XMLSchema">
   <itemSDate>2017-06-19</itemSDate>
   <itemBDate>2017-06-15</itemBDate>
   <AllItemsQuantityFlag>Yes</AllItemsQuantityFlag>
</OutputDetails>

以下是我的XSLT表:

XSLT表:

<?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet version="2.0"
        xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
        xmlns:xs="http://www.w3.org/2001/XMLSchema">

        <xsl:output indent="yes" omit-xml-declaration="yes"/>

        <xsl:template match="/itemDetails">
                <OutputDetails>
                    <itemSDate>
                    <xsl:value-of select="itemShipmentDate"/>
                    </itemSDate>
                    <itemBDate>
                                   <xsl:value-of select="itemBillingDate"/>
                          </itemBDate>
                <xsl:for-each select="itemLines/itemLine">                           
                <xsl:choose>        
                    <xsl:when test="IF All Zeros">          
                        <AllItemsQuantityFlag>Yes</AllItemsQuantityFlag>
                    </xsl:when>
                    <xsl:otherwise>
                        <AllItemsQuantityFlag>No</AllItemsQuantityFlag>

                    </xsl:otherwise>

                </xsl:choose>
                </xsl:for-each>
                 </OutputDetails>
        </xsl:template> 
    </xsl:stylesheet>

有人可以就如何做到这一点提出建议。我只想让这个字段“”在输出中出现一次。

2 个答案:

答案 0 :(得分:1)

您可以使用支票some ... satisfies并将布尔值转换为数字:

            <AllItemsQuantityFlag>
                <xsl:value-of
                  select="number(some $il in itemLines/itemLine satisfies $il/itemQuantity != 0) "/>
            </AllItemsQuantityFlag>

答案 1 :(得分:1)

或者很快:

<xsl:value-of select="number(itemLines/itemLine/itemQuantity!=0)"/>

请注意,“非零”包括空。