无论如何要创建一个多维数组,就像我们在XSLT中的程序编程[4,4,4]中那样,如果有,那么任何人都可以为此提供样本!
答案 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)解析器的一些优点:
A general LALR(1) parser is already implemented in pure XSLT 2.0,是FXSL 的一部分。