计算有更多孩子的孩子的子女数量

时间:2014-02-05 14:56:33

标签: xml xslt xslt-2.0

我有以下代码:

    <Parent>
        <Map sourcename="ItemAName" destinationname="itemaname">
            <Assignment source="Test.OrderA.ItemA" destination="Test.OrderB.ItemA" sourcename="ItemAName" destinationname="ITEMANAME" description="descript3" mandatory="False"/>
            <Assignment source="Test.OrderB.ItemA" destination="Test.OrderC.ItemA" sourcename="ITEMANAME" destinationname="itemaname" description="descript3" mandatory="False"/>
        </Map>
        <Map sourcename="ItemAQuantity" destinationname="itemaquantity">
            <Assignment source="Test.OrderA.ItemA" destination="Test.OrderB.ItemA" sourcename="ItemAQuantity" destinationname="ITEMAQUANTITY" description="descript4" mandatory="False"/>
            <Assignment source="Test.OrderB.ItemA" destination="Test.OrderC.ItemA" sourcename="ITEMAQUANTITY" destinationname="itemaquantity" description="descript4" mandatory="False"/>
            <Assignment source="Test.OrderC.ItemA" destination="Test.OrderD.ItemA" sourcename="itemaquantity" destinationname="ItEmQuAnTiTy" description="descript4" mandatory="False"/>
        </Map>
    </Parent>

我希望显示一个包含6列的表(在Map中包含更多子项的分配数* 2),在本例中。根据xml文件中的数据,有时需要更多或更少。如果我添加另一个包含四个赋值的地图,则该表应该有8列。

我正在使用它:

    <xsl:template match="Map">
        <xsl:if test="position() = 1">
            <tr class="bold">
                <xsl:for-each select="Assignment">
                    <td><xsl:value-of select="@source"/></td>
                    <td><xsl:value-of select="@destination"/></td>
                </xsl:for-each>
            </tr>
         </xsl:if>
         <tr>       
            <xsl:apply-templates select="Assignment"/>  
         </tr>
    </xsl:template> 

    <xsl:template match="Assignment">
        <td><xsl:value-of select="@sourcename" /></td>
        <td><xsl:value-of select="@destinationname" /></td>
    </xsl:template>

我知道我不应该使用if来测试它是否是第一个位置。我需要一种方法来计算有更多作业的孩子的作业数量。

有办法吗?

2 个答案:

答案 0 :(得分:0)

我想你需要这样的东西:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xml:space="default" exclude-result-prefixes="" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="html" omit-xml-declaration="no" indent="yes" />
  <xsl:template match="Parent">
    <xsl:choose>
      <xsl:when test="count(./Map[@sourcename='ItemAName']/Assignment) &gt; count(./Map[@sourcename='ItemAQuantity']/Assignment)">
        Work on the map named ItemAName
    </xsl:when>
      <xsl:otherwise>
       Work on the map named ItemAQuantity
    </xsl:otherwise>
    </xsl:choose>
  </xsl:template>
</xsl:stylesheet>

答案 1 :(得分:0)

  

我需要一种方法来计算孩子的分配数量   更多作业。

我建议你把它放在样式表的顶层:

<xsl:variable name="columns">
    <xsl:for-each select="/Parent/Map">
    <xsl:sort select="count(Assignment)" data-type="number" order="descending"/>
    <xsl:if test="position()=1">
        <xsl:value-of select="2*count(Assignment)"/>
    </xsl:if>
    </xsl:for-each>
</xsl:variable>

现在,您在$ columns变量中拥有所需列数,并可以继续创建它们。如果您愿意,可以告诉变量复制具有最多分配的实际地图,以便您可以在创建列时迭代它们。