使用XSLT将记录添加到XML

时间:2012-08-20 12:33:45

标签: xml xslt invoice

我正在使用看起来像这样的发票数据(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>

1 个答案:

答案 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() &lt;= $size1]"/>
    <xsl:apply-templates select="Line[position() &gt; $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() &lt; $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方法的第二个参数。)