在XSLT中创建多维数组

时间:2011-12-10 18:50:04

标签: arrays xslt xpath xslt-2.0

无论如何要创建一个多维数组,就像我们在XSLT中的程序编程[4,4,4]中那样,如果有,那么任何人都可以为此提供样本!

2 个答案:

答案 0 :(得分:2)

除了简单的序列之外,在XSLT 2.0中实现复杂数据结构的唯一方法是XML树。实现三维阵列的一种方法是作为一组标记的单元格:

<cell i="1" j="2" k="3">value</cell>

或者你可以使用位置表示法:

<plane>
  <row>
    <cell>value</cell>
    <cell>value</cell>
  </row>
  <row>
    ...

实现CYK等算法的问题在于它们被设计为使用可变数据结构。这意味着为了提高效率,您通常需要在功能语言中使用不同的东西。例如,改变三维阵列中的一个单元的内容可以(取决于实现)涉及制作整个结构的副本。这并不会使函数式编程本质上效率低下 - 它只是意味着您有时必须设计不同的算法来利用它的优势。

您为此练习提供的约束 - 告诉您使用什么算法 - 是一个永远不应包含在需求声明中的约束。要求应描述要解决的问题,而不是限制您选择解决问题的方式。

答案 1 :(得分:0)

简短回答为否定

多维数组中没有任何“程序性”。简单地说,XPath是树结构(XML文档)的查询(导航)语言,树结构与多维数组几乎没有任何共同之处。

树结构只是二维

这就是说,可以为多维物体建立类比(模型):

<t>
 <a>
   <b>
     <c>11</c>
     <c>12</c>
     <c>13</c>
     <c>14</c>
   </b>
   <b>
     <c>15</c>
     <c>16</c>
     <c>17</c>
     <c>18</c>
   </b>
   <b>
     <c>19</c>
     <c>20</c>
     <c>21</c>
     <c>22</c>
   </b>
   <b>
     <c>23</c>
     <c>24</c>
     <c>25</c>
     <c>26</c>
   </b>
 </a>
 <a>
   <b>
     <c>27</c>
     <c>28</c>
     <c>29</c>
     <c>30</c>
   </b>
   <b>
     <c>31</c>
     <c>32</c>
     <c>33</c>
     <c>34</c>
   </b>
   <b>
     <c>35</c>
     <c>36</c>
     <c>37</c>
     <c>38</c>
   </b>
   <b>
     <c>39</c>
     <c>40</c>
     <c>41</c>
     <c>42</c>
   </b>
 </a>
 <a>
   <b>
     <c>43</c>
     <c>44</c>
     <c>45</c>
     <c>46</c>
   </b>
   <b>
     <c>47</c>
     <c>48</c>
     <c>49</c>
     <c>50</c>
   </b>
   <b>
     <c>51</c>
     <c>52</c>
     <c>53</c>
     <c>54</c>
   </b>
   <b>
     <c>55</c>
     <c>56</c>
     <c>57</c>
     <c>58</c>
   </b>
 </a>
 <a>
   <b>
     <c>59</c>
     <c>60</c>
     <c>61</c>
     <c>62</c>
   </b>
   <b>
     <c>63</c>
     <c>64</c>
     <c>65</c>
     <c>66</c>
   </b>
   <b>
     <c>67</c>
     <c>68</c>
     <c>69</c>
     <c>70</c>
   </b>
   <b>
     <c>71</c>
     <c>72</c>
     <c>73</c>
     <c>74</c>
   </b>
 </a>
</t>

当我们针对此XPath表达式上的XML文档进行评估时:

/*/a[4]/*[4]/*[4]

所选节点

<c>74</c>

一个完整的XSLT转换示例,使用此类XPath表达式

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>

 <xsl:template match="/*">
  <xsl:value-of select="a[4]/*[4]/*[4]"/>
 </xsl:template>
</xsl:stylesheet>

当对上面的XML文档应用此转换时,会生成所需的正确结果:

74

更新:OP在评论中透露他需要多维数组功能才能在XSLT中实现通用的解析算法。

我建议尝试实现更简单,更有效的解析算法,例如LALR(1)解析。

以下是LALR(1)解析器的一些优点

  1. LALR解析器可以从LALR语法自动生成。
  2. LALR语法可用于定义许多计算机语言。
  3. LALR解析器很小。
  4. LALR解析器速度很快(如果解析算法使用矩阵解析器表格式)。
  5. LALR解析器的速度是线性的(即速度仅基于输入文本文件的大小,而不是基于所识别语言的大小)。
  6. LALR语法提供了有关被识别语言的宝贵文档。
  7. 错误恢复可能已内置于解析器中。
  8. 广告错误消息可能已经内置到解析器中。
  9. 抽象语法树构造可能已经内置到解析器中。
  10. 识别上下文相关的语言结构可能已经内置到解析器中。
  11. A general LALR(1) parser is already implemented in pure XSLT 2.0,是FXSL 的一部分。