Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/eclipse/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 在XSLT中创建多维数组_Arrays_Xslt_Xpath_Xslt 2.0 - Fatal编程技术网

Arrays 在XSLT中创建多维数组

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</

是否有任何方法可以像我们在XSLT的过程编程a[4,4,4]中那样创建多维数组,如果有,任何人都可以给出一个示例

简短的回答是否定的

多维数组中没有任何“程序性”内容。简单地说,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>
所选节点为

/*/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>
  • 可以从LALR语法自动生成LALR解析器
  • LALR语法可用于定义许多计算机语言
  • LALR解析器很小
  • LALR解析器速度很快(如果解析算法使用矩阵解析器表格式)
  • LALR解析器的速度是线性的(即速度仅基于输入文本文件的大小,而不基于被识别语言的大小)
  • LALR语法为被识别的语言提供了有价值的文档
  • 错误恢复可能已经内置到解析器中
  • 通用错误消息可能已经内置到解析器中
  • 抽象语法树构造可能已经内置到解析器中
  • 识别上下文相关的语言结构可能已经内置到解析器中

  • 的一部分

    除了简单的序列之外,在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树中,就像我在回答中提供的那样。