将模板应用于指定键

时间:2015-11-05 05:58:22

标签: xml templates xslt

我正在创建一个XSL样式表,我需要使用单独的XML文档转换为新的XML文档。

它告诉我创建一个键(我做了),再次使用Muenchian分组插入for-each元素。每次进入循环时,它都会要求我写这个代码/"客户"作为根元素:`                        

             <Customer CustomerID="CustomerID">
               <Summary>
                <TotalOrders><xsl:value-of select="count(key('CustomerList', CustomerID))" /></TotalOrders>
                <TotalCharges><xsl:value-of select="format-number(key('CustomerList', OrderCharge, '$#,##0')" /></TotalCharges>
               </Summary>

               <Orders>
                 <xsl:apply-templates select="Order(key('CustomerID', CustomerList))" />
               </Orders>
             </Customer>
             </xsl:for-each>

但那些令我困惑的部分是&#34;计数&#34; in&#34; TotalOrders&#34;是&#34; CustomerList&#34;中的订单数量。密钥,用于当前 CustomerID。它一直说当前,但我不确定这意味着什么,或者我是否正在考虑它。此外,它说&#34;收费&#34;应该是&#34; OrderCharge&#34;的总和。我不确定是否需要添加sum

此外,&#34;订单元素&#34;应该是一个新的模板,应该匹配&#34; Order&#34;模板并描述客户的所有订单。最后,这是我最困惑的部分:

        <Orders>
          <xsl:apply-templates select="Order(key('CustomerID', CustomerList))" />
            </Orders>

这应该适用于&#34;订单&#34; &#34; CustomerList&#34;返回的节点集的模板。关键,但我不确定如果它无效,我怎么能做到。

以下是完整的XSL供参考:

<?xml version="1.0" encoding="UTF-8" ?>

    <xsl:stylesheet version="1.0"
     xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

     <xsl:output method="html"
      doctype-system="about:legacy-compat"
      encoding="UTF-8"
      indent="yes" />     

    <xsl:key name="CustomerList" match="Order" use="CustomerID" />

      <xsl:template match="/">

        <xsl:element name="Customers">
          <xsl:for-each select="//CustomerID[generate-id()=generate-id(key('CustomerList', CustomerID)[1])]">
                 <xsl:sort select="CustomerID" />

                 <Customer CustomerID="CustomerID">
                   <Summary>
                    <TotalOrders><xsl:value-of select="count(key('CustomerList', CustomerID))" /></TotalOrders>
                    <TotalCharges><xsl:value-of select="format-number(key('CustomerList', OrderCharge, '$#,##0')" /></TotalCharges>
                   </Summary>

                   <Orders>
                     <xsl:apply-templates select="Order(key('CustomerID', CustomerList))" />
                   </Orders>
                 </Customer>
                 </xsl:for-each>
       </xsl:element>
     </xsl:template>

    <xsl:template match="Order">
      <Order OrderID="OrderID" OrderDate="OrderDate" ShippedDate="ShippedDate">
        <SalesRep><xsl:value-of select="SalesRepID" /></SalesRep>
        <Charge><xsl:value-of select="format-number(OrderCharge, '$#,##0')" /></Charge>
      </Order>
    </xsl:template>
    </xsl:stylesheet>

以下是XML的一大块供参考:

    <?xml version="1.0" encoding="UTF-8" ?>

<?xml-stylesheet type="text/xsl" href="youngston.xsl" ?>

<Orders>
    <Order OrderID="order53102">
        <OrderDate>2/6/2017</OrderDate>
        <CustomerID>cust640-79</CustomerID>
        <SalesRepID>rep25</SalesRepID>
        <ShippedDate>2/8/2017</ShippedDate>
        <OrderCharge>39.74</OrderCharge>
    </Order>
    <Order OrderID="order53103">
        <OrderDate>2/6/2017</OrderDate>
        <CustomerID>cust514-13</CustomerID>
        <SalesRepID>rep24</SalesRepID>
        <ShippedDate>2/8/2017</ShippedDate>
        <OrderCharge>30.47</OrderCharge>
    </Order>
    <Order OrderID="order53104">
        <OrderDate>2/8/2017</OrderDate>
        <CustomerID>cust473-29</CustomerID>
        <SalesRepID>rep17</SalesRepID>
        <ShippedDate>2/13/2017</ShippedDate>
        <OrderCharge>138.2</OrderCharge>
    </Order>
    <Order OrderID="order53105">
        <OrderDate>2/8/2017</OrderDate>
        <CustomerID>cust316-14</CustomerID>
        <SalesRepID>rep17</SalesRepID>
        <ShippedDate>2/10/2017</ShippedDate>
        <OrderCharge>147.39</OrderCharge>
    </Order>
    <Order OrderID="order53106">
        <OrderDate>2/9/2017</OrderDate>
        <CustomerID>cust211-28</CustomerID>
        <SalesRepID>rep32</SalesRepID>
        <ShippedDate>2/13/2017</ShippedDate>
        <OrderCharge>111.77</OrderCharge>
    </Order>
    <Order OrderID="order53107">
        <OrderDate>2/9/2017</OrderDate>
        <CustomerID>cust473-29</CustomerID>
        <SalesRepID>rep15</SalesRepID>
        <ShippedDate>2/14/2017</ShippedDate>
        <OrderCharge>82.8</OrderCharge>
    </Order>

验证,但是当我通过打开浏览器查看结果文档时,它显示为&#34; rep&#34;和&#34;命令&#34;身份证号码......我真的很感激任何帮助!谢谢。

1 个答案:

答案 0 :(得分:1)

您有一些严重的语法问题,例如:

 <xsl:value-of select="format-number(key('CustomerList', OrderCharge, '$#,##0')" />

(不平衡的括号)和:

<xsl:apply-templates select="Order(key('CustomerID', CustomerList))" />

Order不是函数)。

接下来,您没有正确使用Muenchian分组。如果要按客户对订单进行分组,则必须将密钥定义为:

<xsl:key name="order-by-cust" match="Order" use="CustomerID" />

并在使用密钥时使用(仅)CustomerID

您还需要了解属性值模板。这样:

<Customer CustomerID="CustomerID">

需要:

<Customer CustomerID="{CustomerID}">

否则文字字符串“CustomerID”将作为属性的值返回。

最后,如果要在浏览器中查看此内容,您可能希望将其输出为HTML。您确实将输出方法设置为HTML,但实际上您正在输出XML元素(例如,与HTML表格相反)。

供您参考,以下是您的尝试,已更正:

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:key name="order-by-cust" match="Order" use="CustomerID" />

<xsl:template match="/">
    <Customers>
        <xsl:for-each select="Orders/Order[generate-id()=generate-id(key('order-by-cust', CustomerID)[1])]">
            <xsl:sort select="CustomerID" />
            <Customer CustomerID="{CustomerID}">
                <Summary>
                    <TotalOrders>
                        <xsl:value-of select="count(key('order-by-cust', CustomerID))" />
                    </TotalOrders>
                    <TotalCharges>
                        <xsl:value-of select="format-number(sum(key('order-by-cust', CustomerID)/OrderCharge), '$#,##0')" />
                    </TotalCharges>
                </Summary>
                <Orders>
                    <xsl:apply-templates select="key('order-by-cust', CustomerID)" />
                </Orders>
            </Customer>
        </xsl:for-each>
    </Customers>
</xsl:template>

<xsl:template match="Order">
    <Order OrderID="{@OrderID}" OrderDate="{OrderDate}" ShippedDate="{ShippedDate}">
        <SalesRep>
            <xsl:value-of select="SalesRepID" />
        </SalesRep>
        <Charge>
            <xsl:value-of select="format-number(OrderCharge, '$#,##0')" />
        </Charge>
      </Order>
</xsl:template>

</xsl:stylesheet>

测试输入

<Orders>
    <Order OrderID="order53102">
        <OrderDate>2/6/2017</OrderDate>
        <CustomerID>AAA</CustomerID>
        <SalesRepID>rep25</SalesRepID>
        <ShippedDate>2/8/2017</ShippedDate>
        <OrderCharge>39.74</OrderCharge>
    </Order>
    <Order OrderID="order53103">
        <OrderDate>2/6/2017</OrderDate>
        <CustomerID>BBB</CustomerID>
        <SalesRepID>rep24</SalesRepID>
        <ShippedDate>2/8/2017</ShippedDate>
        <OrderCharge>30.47</OrderCharge>
    </Order>
    <Order OrderID="order53104">
        <OrderDate>2/8/2017</OrderDate>
        <CustomerID>CCC</CustomerID>
        <SalesRepID>rep17</SalesRepID>
        <ShippedDate>2/13/2017</ShippedDate>
        <OrderCharge>138.2</OrderCharge>
    </Order>
    <Order OrderID="order53105">
        <OrderDate>2/8/2017</OrderDate>
        <CustomerID>AAA</CustomerID>
        <SalesRepID>rep17</SalesRepID>
        <ShippedDate>2/10/2017</ShippedDate>
        <OrderCharge>147.39</OrderCharge>
    </Order>
    <Order OrderID="order53106">
        <OrderDate>2/9/2017</OrderDate>
        <CustomerID>BBB</CustomerID>
        <SalesRepID>rep32</SalesRepID>
        <ShippedDate>2/13/2017</ShippedDate>
        <OrderCharge>111.77</OrderCharge>
    </Order>
    <Order OrderID="order53107">
        <OrderDate>2/9/2017</OrderDate>
        <CustomerID>AAA</CustomerID>
        <SalesRepID>rep15</SalesRepID>
        <ShippedDate>2/14/2017</ShippedDate>
        <OrderCharge>82.8</OrderCharge>
    </Order>
</Orders>

<强>结果

<?xml version="1.0" encoding="utf-8"?>
<Customers>
   <Customer CustomerID="AAA">
      <Summary>
         <TotalOrders>3</TotalOrders>
         <TotalCharges>$270</TotalCharges>
      </Summary>
      <Orders>
         <Order OrderID="order53102" OrderDate="2/6/2017" ShippedDate="2/8/2017">
            <SalesRep>rep25</SalesRep>
            <Charge>$40</Charge>
         </Order>
         <Order OrderID="order53105" OrderDate="2/8/2017" ShippedDate="2/10/2017">
            <SalesRep>rep17</SalesRep>
            <Charge>$147</Charge>
         </Order>
         <Order OrderID="order53107" OrderDate="2/9/2017" ShippedDate="2/14/2017">
            <SalesRep>rep15</SalesRep>
            <Charge>$83</Charge>
         </Order>
      </Orders>
   </Customer>
   <Customer CustomerID="BBB">
      <Summary>
         <TotalOrders>2</TotalOrders>
         <TotalCharges>$142</TotalCharges>
      </Summary>
      <Orders>
         <Order OrderID="order53103" OrderDate="2/6/2017" ShippedDate="2/8/2017">
            <SalesRep>rep24</SalesRep>
            <Charge>$30</Charge>
         </Order>
         <Order OrderID="order53106" OrderDate="2/9/2017" ShippedDate="2/13/2017">
            <SalesRep>rep32</SalesRep>
            <Charge>$112</Charge>
         </Order>
      </Orders>
   </Customer>
   <Customer CustomerID="CCC">
      <Summary>
         <TotalOrders>1</TotalOrders>
         <TotalCharges>$138</TotalCharges>
      </Summary>
      <Orders>
         <Order OrderID="order53104" OrderDate="2/8/2017" ShippedDate="2/13/2017">
            <SalesRep>rep17</SalesRep>
            <Charge>$138</Charge>
         </Order>
      </Orders>
   </Customer>
</Customers>