Я ищу библиотеку или инструмент или даже какой-то простой код, который может анализировать данные Xpath / XSLT в наших файлах XSLT, чтобы создать словарь / список / дерево всех узлов XML, с которыми XSLT ожидает работать или находить. К сожалению, все, что я нахожу, имеет дело с использованием XSLT для анализа XML, а не с разбором XSLT. И действительно сложная часть, с которой я сталкиваюсь, это насколько гибкий XPath.
Например, в нескольких файлах XSLT, с которыми мы работаем, можно выбрать
nodeX/nodeY/nodeNeeded;
OR
../nodeNeeded;
OR
выберите nodeX
, затем выберите nodeY
, затем выберите nodeNeeded
;
и пр.
То, что мы хотели бы сделать, - это иметь возможность проанализировать этот документ XSLT и получить структуру данных такого рода, которая явно говорит нам о том, что XSLT ищет nodeNeeded в path nodeX, nodeY, чтобы мы могли настраивать сборку XML данные в стиле минимализма
Спасибо!
Вот макет подмножества данных для целей визуализации:
<server_stats>
<server name="fooServer">
<uptime>24d52m</uptime>
<userCount>123456</userCount>
<loggedInUsers>
<user name="AnnaBannana">
<created>01.01.2012:00.00.00</created>
<loggedIn>25</loggedIn>
<posts>3</posts>
</user>
</loggedInUsers>
<temperature>82F</temperature>
<load>72</load>
<mem_use>45</mem_use>
<visitors>
<current>42</current>
<browsers name="mozilla" version="X.Y.Z">22</browsers>
<popular_link name="index.html">39</popular_link>
<history>
<max_visitors>789</max_visitors>
<average_visitors>42</average_visitors>
</history>
</visitors>
</server>
</server_stats>
Исходя из этого, один из клиентов может просто захотеть создать HTML-страницу администратора, где он извлекает статистику оборудования из дерева и, возможно, запускает некоторые расчеты нагрузки из числа посетителей. Другой клиент может просто захотеть получить информацию о количестве посетителей для отображения на своем общедоступном сайте. Чтобы система загрузки каждого из этих клиентов была как можно меньше, мы хотели бы проанализировать их статистику, выбирая XSLT, и предоставить им только те данные, которые им нужны (что было запрошено). Очевидно, проблема заключается в том, что один клиент может выполнить прямой выбор на узле подсчета посетителей, а другой может выбрать узел посетителей и выбрать каждый из дочерних узлов, которые он хочет, и т. Д.
У двух гипотетических клиентов, ищущих «текущий» узел в «посетителях», XSLT может выглядеть следующим образом:
<xsl:template match="server_stats/server/visitors">
<xsl:value-of select="current"/>
</xsl:template>
OR
<xsl:template match="server_stats">
<xsl:for-each select="server">
<xsl:value-of select="visitors/current"/>
<xsl:value-of select="visitors/popular_link"/>
</xsl:for-each>
</xsl:template>
В этом примере оба пытаются выбрать один и тот же узел, но способ, которым они это делают, отличается, и «current» не настолько специфичен, поэтому нам также нужен путь, который они использовали для этого, поскольку «current» может быть узлами для несколько предметов. Это мешает нам просто искать «current» в их XSLT, и поскольку способ доступа к пути может сильно отличаться, мы не можем просто искать весь путь.
Итак, мы хотели бы проанализировать их XSLT и дать нам список статистики:
Customer 1:
visitors/current
Customer 2:
visitors/current
visitors/popular_link
и т.д.
В некоторых примерах выбирается решение, приведенное ниже, над которым мы будем работать:
<xsl:variable name="fcolor" select="'Black'"/> results in a /'Black' entry
<xsl:for-each select="server"> we get the entry, but its children don't show it anymore
<xsl:value-of select="../../@name"/> This was kind of expected, we can try to figure out how to skip attribute based selections but the relative paths show up as I thought they would
<xsl:when test="substring(someNode,1,2)=0 and substring(someNode,4,2)=0 and substring(someNode,7,2)>30"> This one is kind of throwing me, because this shows up as a path item, it's due to the when check in the solution but I don't see any nice solution since the same basic statement could have been checking for a branching path, so this might just be one of those cases we need to post-process or something of that nature.