Передача переменной из XSL: for-each в XSL: for-each - PullRequest
1 голос
/ 17 октября 2010

Я пытаюсь дать переменной значение в XSL: for-each и получить доступ к переменной после завершения цикла XSL: for (или даже после его перемещения в следующий XSL: for-each).Я пытался использовать как глобальные, так и локальные переменные, но они не работают.

Возможно ли это?Если нет, есть ли другой способ обойти проблему?

-Hammer

Ответы [ 3 ]

2 голосов
/ 17 октября 2010

Я пытаюсь дать переменной значение в XSL: for-each и получить доступ к переменной после завершения цикла XSL: for (или даже после того, как он переместился в следующий XSL: for-each)

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

См. этот очень похожий вопрос для подробного объяснения.Также читайте эту ветку , так как она также тесно связана.

1 голос
/ 12 июля 2016

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

<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:mvn="http://maven.apache.org/POM/4.0.0">
  <xsl:variable name="project" select="/mvn:project" />

  <xsl:template name="parseDependencies">
    <xsl:param name="profile" />
    <xsl:for-each select="$profile/mvn:dependencies/mvn:dependency">
        <dependency>
          <xsl:attribute name="profile">
            <xsl:value-of select="$profile/mvn:id" />
          </xsl:attribute>
          <xsl:for-each select="mvn:*[node()]">
            <xsl:element name="{name(.)}">
              <xsl:call-template name="parseContent">
                <xsl:with-param name="text" select="text()" />
              </xsl:call-template>
            </xsl:element>
          </xsl:for-each>
        </dependency>
    </xsl:for-each>
  </xsl:template>

  <xsl:template match="mvn:project">
      <dependencies>
        <xsl:call-template name="parseDependencies">
          <xsl:with-param name="profile" select="." />
        </xsl:call-template>
        <xsl:for-each select="mvn:profiles/mvn:profile">
          <xsl:call-template name="parseDependencies">
            <xsl:with-param name="profile" select="." />
          </xsl:call-template>
        </xsl:for-each>
      </dependencies>
  </xsl:template>
</xsl:stylesheet>

Здесь я вызываю parseDependencies в проекте maven (pom.xml) для сканирования зависимостей в узле проекта и для каждого узла профиля. Для регистрации "узла" я использую параметр $ profile, а когда я анализирую цикл зависимостей, я использовал его для получения профиля "id".

Примечание: parseContent отсутствует, но он используется для разрешения параметров maven.

0 голосов
/ 17 октября 2010

Переменные XSLT являются неизменяемыми (не могут быть изменены) и строго ограничены.

Вы всегда можете обернуть xsl:for-each xsl:variable. Любые текстовые значения, выделенные в пределах xsl:for-each, будут присвоены xsl:variable.

Например, следующая таблица стилей объявляет переменную textValueCSV. В пределах xsl:for-each он использует xsl:value-of и xsl:text. Все текстовые значения присваиваются переменной textValuesCSV, которая используется за пределами из xsl:for-each для выбора ее значения.

<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:output method="text" />

<xsl:template match="/">

    <xsl:variable name="textValuesCSV">
        <xsl:for-each select="/*/*">
            <xsl:value-of select="."/>
            <xsl:if test="position()!=last()">
                <xsl:text>,</xsl:text>
            </xsl:if>
        </xsl:for-each>
    </xsl:variable>

    <xsl:value-of select="$textValuesCSV"/>

</xsl:template>

</xsl:stylesheet>

Применительно к этому XML:

<doc>
    <a>1</a>
    <b>2</b>
    <c>3</c>
</doc>

Производит этот вывод:

1,2,3
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...