2010-10-17 3 views
1

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

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

-Hammer

+0

Пожалуйста, предоставьте код XML и XSLT (минимальный, пожалуйста) и лучше объясните, в чем проблема. Тогда многие из читателей смогут показать вам решение. Что касается вашего общего вопроса, ответ отрицательный, как уже объяснялось @Tomalak и @ Mads-Hansen. –

ответ

2

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

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

См. this very similar question для подробного объяснения. Также read this thread, так как он тесно связан.

0

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

Вы всегда можете обернуть xsl:for-eachxsl: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 
1

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

<?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».

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

Смежные вопросы