我正在创建一个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;身份证号码......我真的很感激任何帮助!谢谢。
答案 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>