我正在使用看起来像这样的发票数据(2条记录):
<?xml version=1.0" encoding="Windows-1252"?>
<Line>
<SupplierID>Waltons</SupplierID>
<InvoiceID>MOD280229SI</InvoiceID>
<InvoiceDate>20120709</InvoiceDate>
<ItemID>847308</ItemID>
<ColorID>04</ColorID>
<Description>BANTEX Quotation Folder A4 3420</Description>
<MainCategory>FILES FILING</MainCategory>
<SubCategory>Quotation Folders</SubCategory>
<LineNum>17.0000000</LineNum>
<Qty>30.0000000</Qty>
<UnitPriceExclTax>19.2500000</UnitPriceExclTax>
<LineTax>80.8500000</LineTax>
<LinePriceExclTax>577.5000000</LinePriceExclTax>
<ColorName>Blue</ColorName>
<UOM>Ea</UOM>
<Backorder>0.0000000</Backorder>
<INVENTTRANSID>MOD2923560_060</INVENTTRANSID>
</Line>
<Line>
<SupplierID>Waltons</SupplierID>
<InvoiceID>MOD280229SI</InvoiceID>
<InvoiceDate>20120709</InvoiceDate>
<ItemID>847308</ItemID>
<ColorID>06</ColorID>
<Description>BANTEX Quotation Folder A4 3420</Description>
<MainCategory>FILES FILING</MainCategory>
<SubCategory>Quotation Folders</SubCategory>
<LineNum>18.0000000</LineNum>
记住上述结构,订单可能包含数百条这样的行。
我将这些打印到发票页面,页面上只能容纳18行,我页面上的溢出规则已经适用于此。
我唯一的问题是,我需要打印第1页的第17页,然后单词余额继续前进,然后在下一页开始平衡提前等。
我想按如下方式构建XML
前16行没有改变 在第16行之后,我想插入一个只有Balance Carried Forward的新行 之后我想插入另一个总共17行的空白行(我想故意将最后一行留空) 在空白行之后插入另一行包含Balance Brought Forward 在此行之后,我的数据可以继续,从第17行开始,然后在另外15行之后,执行相同的操作,直到数据结束。
有人能指出我正确的方向建立这样的东西吗?
我能做的就是XSLT 1或2,甚至可能用VBS的JavaScript。
我可以控制XML的结构,我将其输出为没有任何子元素的平面文件,因为我首先需要进行一些小的更改,然后我将其与我的XML文件的其余部分合并,所以让我们说XML以
开头并以结束按行我的意思是记录,所以上面的XML有两行(由于复制错误而不完整的第二行)通过插入另一行,我的意思是我想添加一个完整的新XXX元素
好的想象一下,我开始使用包含40行(元素)的XML
<Line>
xxx
</Line> x40
我想要的是如下:
<Line> <!-- x16 lines. from data -->
xxx
</Line>
<Line> - <!-- Inserted -->
<LinePriceExclTax>Balance Carried Forward</LinePriceExclTax>
</Line> - <!-- Inserted -->
<Line></Line>
<Line> - <!-- Inserted -->
<LinePriceExclTax>Balance Brought Forward</LinePriceExclTax>
</Line>
<Line> <!-- x15 lines. From data -->
xxx
</Line>
<Line> <!-- Inserted -->
<LinePriceExclTax>Balance Carried Forward</LinePriceExclTax>
</Line> <!-- Inserted -->
<Line></Line>
<Line> <!-- Inserted -->
<LinePriceExclTax>Balance Brought Forward</LinePriceExclTax>
</Line>
<Line> <!-- x9 lines. from data -->
xxx
</Line>
答案 0 :(得分:2)
以下是关于如何使用.NET框架中的XslCompiledTransform解决这个问题的建议,您可以使用带有ConformanceLevel.Fragment的XmlReader读取XML片段,然后可以使用XSLT处理输入,如
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl"
>
<xsl:param name="size1" select="16"/>
<xsl:param name="size2" select="15"/>
<xsl:param name="to-be-inserted">
<Line>
<LinePriceExclTax>Balance Carried Forward</LinePriceExclTax>
</Line>
<Line></Line>
<Line>
<LinePriceExclTax>Balance Brought Forward</LinePriceExclTax>
</Line>
</xsl:param>
<xsl:output method="xml" indent="yes"/>
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="/">
<xsl:apply-templates select="Line[position() <= $size1]"/>
<xsl:apply-templates select="Line[position() > $size1][position() mod $size2 = 1]" mode="group"/>
</xsl:template>
<xsl:template match="Line" mode="group">
<xsl:copy-of select="$to-be-inserted"/>
<xsl:apply-templates select=". | following-sibling::Line[position() < $size2]"/>
</xsl:template>
</xsl:stylesheet>
要使用不是格式良好的XML文档的输入文件运行该样式表,您需要以下代码:
string sampleInput = @"input1.xml";
string sampleResult = @"result1.xml";
XslCompiledTransform proc = new XslCompiledTransform();
proc.Load("sheet.xslt");
using (XmlReader xr = XmlReader.Create(sampleInput, new XmlReaderSettings() { ConformanceLevel = ConformanceLevel.Fragment }))
{
using (FileStream fs = File.OpenWrite(sampleResult))
{
proc.Transform(xr, null, fs);
}
}
假设您有一个像
这样的输入文件<Line>
<Id>1</Id>
</Line>
<Line>
<Id>2</Id>
</Line>
<Line>
<Id>3</Id>
</Line>
<Line>
<Id>4</Id>
</Line>
<Line>
<Id>5</Id>
</Line>
<Line>
<Id>6</Id>
</Line>
<Line>
<Id>7</Id>
</Line>
<Line>
<Id>8</Id>
</Line>
<Line>
<Id>9</Id>
</Line>
<Line>
<Id>10</Id>
</Line>
<Line>
<Id>11</Id>
</Line>
<Line>
<Id>12</Id>
</Line>
<Line>
<Id>13</Id>
</Line>
<Line>
<Id>14</Id>
</Line>
<Line>
<Id>15</Id>
</Line>
<Line>
<Id>16</Id>
</Line>
<Line>
<Id>17</Id>
</Line>
<Line>
<Id>18</Id>
</Line>
<Line>
<Id>19</Id>
</Line>
<Line>
<Id>20</Id>
</Line>
<Line>
<Id>21</Id>
</Line>
<Line>
<Id>22</Id>
</Line>
<Line>
<Id>23</Id>
</Line>
<Line>
<Id>24</Id>
</Line>
<Line>
<Id>25</Id>
</Line>
<Line>
<Id>26</Id>
</Line>
<Line>
<Id>27</Id>
</Line>
<Line>
<Id>28</Id>
</Line>
<Line>
<Id>29</Id>
</Line>
<Line>
<Id>30</Id>
</Line>
<Line>
<Id>31</Id>
</Line>
<Line>
<Id>32</Id>
</Line>
<Line>
<Id>33</Id>
</Line>
<Line>
<Id>34</Id>
</Line>
<Line>
<Id>35</Id>
</Line>
<Line>
<Id>36</Id>
</Line>
<Line>
<Id>37</Id>
</Line>
<Line>
<Id>38</Id>
</Line>
<Line>
<Id>39</Id>
</Line>
<Line>
<Id>40</Id>
</Line>
<Line>
<Id>41</Id>
</Line>
<Line>
<Id>42</Id>
</Line>
<Line>
<Id>43</Id>
</Line>
<Line>
<Id>44</Id>
</Line>
<Line>
<Id>45</Id>
</Line>
<Line>
<Id>46</Id>
</Line>
<Line>
<Id>47</Id>
</Line>
<Line>
<Id>48</Id>
</Line>
<Line>
<Id>49</Id>
</Line>
<Line>
<Id>50</Id>
</Line>
<Line>
<Id>51</Id>
</Line>
<Line>
<Id>52</Id>
</Line>
<Line>
<Id>53</Id>
</Line>
<Line>
<Id>54</Id>
</Line>
<Line>
<Id>55</Id>
</Line>
<Line>
<Id>56</Id>
</Line>
<Line>
<Id>57</Id>
</Line>
<Line>
<Id>58</Id>
</Line>
<Line>
<Id>59</Id>
</Line>
<Line>
<Id>60</Id>
</Line>
<Line>
<Id>61</Id>
</Line>
<Line>
<Id>62</Id>
</Line>
<Line>
<Id>63</Id>
</Line>
<Line>
<Id>64</Id>
</Line>
<Line>
<Id>65</Id>
</Line>
<Line>
<Id>66</Id>
</Line>
<Line>
<Id>67</Id>
</Line>
<Line>
<Id>68</Id>
</Line>
<Line>
<Id>69</Id>
</Line>
<Line>
<Id>70</Id>
</Line>
<Line>
<Id>71</Id>
</Line>
<Line>
<Id>72</Id>
</Line>
<Line>
<Id>73</Id>
</Line>
<Line>
<Id>74</Id>
</Line>
<Line>
<Id>75</Id>
</Line>
<Line>
<Id>76</Id>
</Line>
<Line>
<Id>77</Id>
</Line>
<Line>
<Id>78</Id>
</Line>
<Line>
<Id>79</Id>
</Line>
<Line>
<Id>80</Id>
</Line>
<Line>
<Id>81</Id>
</Line>
<Line>
<Id>82</Id>
</Line>
<Line>
<Id>83</Id>
</Line>
<Line>
<Id>84</Id>
</Line>
<Line>
<Id>85</Id>
</Line>
<Line>
<Id>86</Id>
</Line>
<Line>
<Id>87</Id>
</Line>
<Line>
<Id>88</Id>
</Line>
<Line>
<Id>89</Id>
</Line>
<Line>
<Id>90</Id>
</Line>
<Line>
<Id>91</Id>
</Line>
<Line>
<Id>92</Id>
</Line>
<Line>
<Id>93</Id>
</Line>
<Line>
<Id>94</Id>
</Line>
<Line>
<Id>95</Id>
</Line>
<Line>
<Id>96</Id>
</Line>
<Line>
<Id>97</Id>
</Line>
<Line>
<Id>98</Id>
</Line>
<Line>
<Id>99</Id>
</Line>
<Line>
<Id>100</Id>
</Line>
我得到的结果如
<?xml version="1.0" encoding="utf-8"?>
<Line>
<Id>1</Id>
</Line>
<Line>
<Id>2</Id>
</Line>
<Line>
<Id>3</Id>
</Line>
<Line>
<Id>4</Id>
</Line>
<Line>
<Id>5</Id>
</Line>
<Line>
<Id>6</Id>
</Line>
<Line>
<Id>7</Id>
</Line>
<Line>
<Id>8</Id>
</Line>
<Line>
<Id>9</Id>
</Line>
<Line>
<Id>10</Id>
</Line>
<Line>
<Id>11</Id>
</Line>
<Line>
<Id>12</Id>
</Line>
<Line>
<Id>13</Id>
</Line>
<Line>
<Id>14</Id>
</Line>
<Line>
<Id>15</Id>
</Line>
<Line>
<Id>16</Id>
</Line>
<Line>
<LinePriceExclTax>Balance Carried Forward</LinePriceExclTax>
</Line>
<Line />
<Line>
<LinePriceExclTax>Balance Brought Forward</LinePriceExclTax>
</Line>
<Line>
<Id>17</Id>
</Line>
<Line>
<Id>18</Id>
</Line>
<Line>
<Id>19</Id>
</Line>
<Line>
<Id>20</Id>
</Line>
<Line>
<Id>21</Id>
</Line>
<Line>
<Id>22</Id>
</Line>
<Line>
<Id>23</Id>
</Line>
<Line>
<Id>24</Id>
</Line>
<Line>
<Id>25</Id>
</Line>
<Line>
<Id>26</Id>
</Line>
<Line>
<Id>27</Id>
</Line>
<Line>
<Id>28</Id>
</Line>
<Line>
<Id>29</Id>
</Line>
<Line>
<Id>30</Id>
</Line>
<Line>
<Id>31</Id>
</Line>
<Line>
<LinePriceExclTax>Balance Carried Forward</LinePriceExclTax>
</Line>
<Line />
<Line>
<LinePriceExclTax>Balance Brought Forward</LinePriceExclTax>
</Line>
<Line>
<Id>32</Id>
</Line>
<Line>
<Id>33</Id>
</Line>
<Line>
<Id>34</Id>
</Line>
<Line>
<Id>35</Id>
</Line>
<Line>
<Id>36</Id>
</Line>
<Line>
<Id>37</Id>
</Line>
<Line>
<Id>38</Id>
</Line>
<Line>
<Id>39</Id>
</Line>
<Line>
<Id>40</Id>
</Line>
<Line>
<Id>41</Id>
</Line>
<Line>
<Id>42</Id>
</Line>
<Line>
<Id>43</Id>
</Line>
<Line>
<Id>44</Id>
</Line>
<Line>
<Id>45</Id>
</Line>
<Line>
<Id>46</Id>
</Line>
<Line>
<LinePriceExclTax>Balance Carried Forward</LinePriceExclTax>
</Line>
<Line />
<Line>
<LinePriceExclTax>Balance Brought Forward</LinePriceExclTax>
</Line>
<Line>
<Id>47</Id>
</Line>
<Line>
<Id>48</Id>
</Line>
<Line>
<Id>49</Id>
</Line>
<Line>
<Id>50</Id>
</Line>
<Line>
<Id>51</Id>
</Line>
<Line>
<Id>52</Id>
</Line>
<Line>
<Id>53</Id>
</Line>
<Line>
<Id>54</Id>
</Line>
<Line>
<Id>55</Id>
</Line>
<Line>
<Id>56</Id>
</Line>
<Line>
<Id>57</Id>
</Line>
<Line>
<Id>58</Id>
</Line>
<Line>
<Id>59</Id>
</Line>
<Line>
<Id>60</Id>
</Line>
<Line>
<Id>61</Id>
</Line>
<Line>
<LinePriceExclTax>Balance Carried Forward</LinePriceExclTax>
</Line>
<Line />
<Line>
<LinePriceExclTax>Balance Brought Forward</LinePriceExclTax>
</Line>
<Line>
<Id>62</Id>
</Line>
<Line>
<Id>63</Id>
</Line>
<Line>
<Id>64</Id>
</Line>
<Line>
<Id>65</Id>
</Line>
<Line>
<Id>66</Id>
</Line>
<Line>
<Id>67</Id>
</Line>
<Line>
<Id>68</Id>
</Line>
<Line>
<Id>69</Id>
</Line>
<Line>
<Id>70</Id>
</Line>
<Line>
<Id>71</Id>
</Line>
<Line>
<Id>72</Id>
</Line>
<Line>
<Id>73</Id>
</Line>
<Line>
<Id>74</Id>
</Line>
<Line>
<Id>75</Id>
</Line>
<Line>
<Id>76</Id>
</Line>
<Line>
<LinePriceExclTax>Balance Carried Forward</LinePriceExclTax>
</Line>
<Line />
<Line>
<LinePriceExclTax>Balance Brought Forward</LinePriceExclTax>
</Line>
<Line>
<Id>77</Id>
</Line>
<Line>
<Id>78</Id>
</Line>
<Line>
<Id>79</Id>
</Line>
<Line>
<Id>80</Id>
</Line>
<Line>
<Id>81</Id>
</Line>
<Line>
<Id>82</Id>
</Line>
<Line>
<Id>83</Id>
</Line>
<Line>
<Id>84</Id>
</Line>
<Line>
<Id>85</Id>
</Line>
<Line>
<Id>86</Id>
</Line>
<Line>
<Id>87</Id>
</Line>
<Line>
<Id>88</Id>
</Line>
<Line>
<Id>89</Id>
</Line>
<Line>
<Id>90</Id>
</Line>
<Line>
<Id>91</Id>
</Line>
<Line>
<LinePriceExclTax>Balance Carried Forward</LinePriceExclTax>
</Line>
<Line />
<Line>
<LinePriceExclTax>Balance Brought Forward</LinePriceExclTax>
</Line>
<Line>
<Id>92</Id>
</Line>
<Line>
<Id>93</Id>
</Line>
<Line>
<Id>94</Id>
</Line>
<Line>
<Id>95</Id>
</Line>
<Line>
<Id>96</Id>
</Line>
<Line>
<Id>97</Id>
</Line>
<Line>
<Id>98</Id>
</Line>
<Line>
<Id>99</Id>
</Line>
<Line>
<Id>100</Id>
</Line>
要插入新元素的Line
元素的数量和要插入的内容是样式表的参数,因此您可以编辑样式表,甚至可以使用代码设置它们(通过传递{ {1}}作为XsltArgumentList
方法的第二个参数。)