Arrays 在XSLT中创建多维数组
是否有任何方法可以像我们在XSLT的过程编程a[4,4,4]中那样创建多维数组,如果有,任何人都可以给出一个示例 简短的回答是否定的 多维数组中没有任何“程序性”内容。简单地说,XPath是树结构(XML文档)的查询(导航)语言,而树结构与多维数组几乎没有任何共同之处 树结构只是二维的 也就是说,人们可以建立多维对象的类比(模型):Arrays 在XSLT中创建多维数组,arrays,xslt,xpath,xslt-2.0,Arrays,Xslt,Xpath,Xslt 2.0,是否有任何方法可以像我们在XSLT的过程编程a[4,4,4]中那样创建多维数组,如果有,任何人都可以给出一个示例 简短的回答是否定的 多维数组中没有任何“程序性”内容。简单地说,XPath是树结构(XML文档)的查询(导航)语言,而树结构与多维数组几乎没有任何共同之处 树结构只是二维的 也就是说,人们可以建立多维对象的类比(模型): <t> <a> <b> <c>11</c> <c>12</
<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>
所选节点为:
/*/a[4]/*[4]/*[4]
<c>74</c>
<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>
更新:OP在评论中透露,他需要多维数组功能,以便在XSLT中实现通用解析算法
我建议尝试实现一种更简单、更高效的解析算法,比如LALR(1)解析
以下是LALR(1)解析器的一些优点:
/*/a[4]/*[4]/*[4]
<c>74</c>
<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>
是的一部分除了简单的序列之外,在XSLT2.0中实现复杂数据结构的唯一方法是XML树。实现三维阵列的一种方法是将其作为一组标记单元:
<cell i="1" j="2" k="3">value</cell>
值
或者,也可以使用位置表达:
<plane>
<row>
<cell>value</cell>
<cell>value</cell>
</row>
<row>
...
价值
价值
...
实现诸如CYK之类的算法的问题在于,它们被设计为使用可变数据结构。这意味着为了提高效率,在函数式语言中通常需要一些不同的东西。例如,更改三维数组中一个单元格的内容可能(取决于实现)涉及制作整个结构的副本。这并不是说函数式编程本质上是低效的——它只是意味着你有时不得不设计不同的算法来利用它的优势
在这个练习中,您得到的约束——告诉您要使用什么算法——是一个永远不应该包含在需求声明中的约束。需求应该描述要解决的问题,而不是限制您选择的解决方法。为什么?您需要什么?我正在XSLT中实现CYK算法(),我确实需要一个数组。似乎我没有完全弄清楚,我需要在XSLT文件中使用数组结构,这意味着我需要迭代我的数组,它是基于索引的。@Peymankh:XSLT使用XPath和XPath(1.0、2.0,甚至第四代3.0)没有数组。因此,XPath中没有这样的直接功能。您可以调用一个扩展函数
matr(M,ind1,ind2,ind3)
,并在另一个传统的PL中实现这个扩展函数。@Peymankh:至于您说您想要一个多维数组“在XSLT中”而不是“在XML中”,您必须知道:1。任何XSLT样式表都是格式良好的XML文档;2.可以使用任何XML树作为XSLT样式表的一部分;3.可以使用标准XSLT函数document()
在XSLT转换中访问其他XML文档。因此,多维数组的XML模型是完全可能的,并且可能是在XSLT中实现“类似多维数组的东西”(不使用扩展函数)的唯一可能的方法。感谢您的编辑,但问题是我需要基于CYK算法实现它,因为这是一项课程工作@Peymankh:如果必须实现这个算法,那么必须使用XPath中可用的数据结构,并使用它们来模拟多维矩阵。询问他们是否允许扩展函数表示多维矩阵。如果不允许使用扩展函数,那么必须将数据保存在XML树中,就像我在回答中提供的那样。