如何根据XSLT2.0中所有重复元素的值做出决策

如何根据XSLT2.0中所有重复元素的值做出决策,xslt,mapping,xslt-grouping,Xslt,Mapping,Xslt Grouping,我有以下XML输入,我想对其执行一些转换 输入XML: <itemDetails> <itemShipmentDate>2017-06-19</itemShipmentDate> <itemBillingDate>2017-06-15</itemBillingDate> <itemLines> <itemLine> <itemId>1&

我有以下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>
<OutputDetails xmlns:xs="http://www.w3.org/2001/XMLSchema">
   <itemSDate>2017-06-19</itemSDate>
   <itemBDate>2017-06-15</itemBDate>
   <AllItemsQuantityFlag>Yes</AllItemsQuantityFlag>
</OutputDetails>
<?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>

2017-06-19
2017-06-15
1.
0
2.
0
3.
0
4.
0
5.
0
问题陈述:

<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>
<OutputDetails xmlns:xs="http://www.w3.org/2001/XMLSchema">
   <itemSDate>2017-06-19</itemSDate>
   <itemBDate>2017-06-15</itemBDate>
   <AllItemsQuantityFlag>Yes</AllItemsQuantityFlag>
</OutputDetails>
<?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>
我想检查一下,如果所有itemLine中的“Quantity”标记都等于零,那么在输出中的一个字段,即“AllItemsQuantityFlag”值应该是“Yes”,如果其中一个Quantity标记不是零,那么输出应该是“No”。 所以,有点像其他情况

因此,在上述输入情况下,我们将有以下输出:

所需输出:

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

2017-06-19
2017-06-15
对
以下是我的XSLT表:

XSLT工作表:

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

对
不

有人能告诉我怎么做吗?我只希望这个字段“”在输出中出现一次。

您可以使用检查
some…
并将布尔值转换为数字:

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

或稍后:

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



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

感谢您的回复,它可以工作,但如果我想用稍微不同的方式检查它,如果全部为零,则我想写“是”,如果至少一个输入字段中有“1”,则我想写“否”“在田野里。对不起,我刚才忘了提。。我现在已经编辑了这个问题。@omerkhalid然后使用:
谢谢你的回答,但是如果我想用稍微不同的方式检查它,如果全部为零,那么我想写“是”,如果至少一个输入字段中有“1”,那么我想在字段中写“否”。对不起,我刚才忘了提。。我现在编辑了这个问题。你现在能看一下吗??