Создание многомерных массивов в XSLT - PullRequest
1 голос
/ 10 декабря 2011

Можно ли в любом случае создать многомерный массив, как мы это делаем при процедурном программировании [4,4,4] в XSLT, и если да, может кто-нибудь дать пример для этого!

Ответы [ 2 ]

2 голосов
/ 11 декабря 2011

Помимо простых последовательностей, единственный способ реализации сложных структур данных в XSLT 2.0 - это деревья XML. Одним из способов реализации трехмерного массива может быть набор помеченных ячеек:

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

В качестве альтернативы вы можете использовать позиционное представление:

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

Проблема с реализацией таких алгоритмов, как CYK, заключается в том, что они предназначены для использования изменяемых структур данных. Это означает, что для эффективности вам часто нужно что-то другое в функциональном языке. Например, изменение содержимого одной ячейки в трехмерном массиве может (в зависимости от реализации) включать создание копии всей структуры. Это не делает функциональное программирование по сути неэффективным - это просто означает, что вам иногда приходится разрабатывать разные алгоритмы, чтобы использовать его преимущества.

Ограничение, которое вам было дано для этого упражнения - указание того, какой алгоритм использовать - это то, которое никогда не должно включаться в утверждение требований. Требования должны описывать проблему, которая должна быть решена, а не ограничивать то, как вы решаете ее.

0 голосов
/ 10 декабря 2011

Короткий ответ отрицательный .

В многомерном массиве нет ничего "процедурного".Проще говоря, 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>

Когда мы сравниваем XML-документ над этим выражением XPath :

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

Обновление : ФП обнаружил в комментарии, что онДля реализации общего алгоритма синтаксического анализа в XSLT необходима возможность многомерного массива.

Я бы посоветовал попытаться реализовать более простой и эффективный алгоритм синтаксического анализа, такой как LALR (1).

Вот некоторые преимущества парсера LALR (1) :

  1. Парсер LALR может автоматически генерироваться из грамматики LALR.
  2. LALRграмматика может использоваться для определения многих компьютерных языков.
  3. Парсер LALR мал.
  4. Парсер LALR быстрый (если алгоритм синтаксического анализа использует формат таблицы матричного парсера).
  5. Синтаксический анализатор LALR имеет линейную скорость (т. Е. Скорость зависит от размера только входного текстового файла, а не от размера распознаваемого языка).
  6. Грамматика LALR предоставляет ценную документациюраспознаваемого языка.
  7. Восстановление уже может быть встроено в анализатор.
  8. Обобщенные сообщения об ошибках уже могут быть встроены в анализатор.
  9. Абстрактный синтаксисКонструкция дерева может быть уже встроена в синтаксический анализатор.
  10. Распознавание контекстно-зависимых языковых конструкций уже может быть встроено в синтаксический анализатор.

Общий LALR(1) парсер уже реализован в чистом XSLT 2.0 и является частью FXSL .

...