Получение всех неиспользуемых переменных в таблице стилей XSL - PullRequest
0 голосов
/ 26 апреля 2018

Я пытаюсь создать выражение XPath, которое выдаст мне все неиспользуемые переменные в таблице стилей XSL и в предыдущем текстовом узле, если оно только для пробелов.

Моя текущая попытка такая:

for $var in //xsl:variable|xsl:param return($var[not(following-sibling::*/descendant-or-self::*[@*[contains(., concat('$', $var/@name))]])]/(., preceding-sibling::text()[1][normalize-space(.) = '']))

Однако, поскольку я полагаюсь на функцию contains() для получения переменных, я также получаю ложные отрицания, например,

<xsl:variable name="abc"/> <xsl:value-of select="$abcdef"/>

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

1 Ответ

0 голосов
/ 26 апреля 2018

Если вы действительно хотите сделать это строго, вам нужно понять правила привязки переменных в деталях. Например, учитывая:

<xsl:template match="x">
  <xsl:variable name="y"/>
  <xsl:variable name="y"/>
  <xsl:value-of select="$y"/>
</xsl:template>

тогда первая переменная "y" не используется.

Это осложняется тем фактом, что вы можете иметь прямые ссылки на глобальные переменные, но не на локальные переменные.

Кроме того, если вы хотите быть очень строгим, вам нужно учитывать тот факт, что имена переменных могут быть квалифицированы в пространстве имен, а при сопоставлении имен используются URI пространства имен, а не префиксы.

А как насчет ссылок, появляющихся, например, в закомментированном коде?

И не очень широко известно, что вам разрешено иметь пробел и комментарии между '$' и именем в ссылке на переменную:

$ (:no-one ever does this:) x + $ (:thankfully:) y

Итак, первое сокращение, которое просто обнаруживает имена переменных, которые объявлены, но никогда не появляются в ссылке на переменную, не слишком сложно; Строгое решение, которое не дает ложных срабатываний и ложных отрицаний, требует доступа к полному дереву разбора таблицы стилей и ее выражений XPath. Трудность заключается в том, что при очевидных способах получения такого дерева разбора (например, файла экспорта SEF Саксона) неиспользованные переменные уже будут отброшены.

Какова цель упражнения: как вы собираетесь использовать результаты?

...