Перезаписать переменную в xsl

Мне просто нужно перезаписать переменную в xsl

Example:
x=0
if x=0
then
x=3

Мне нужно изменить значение переменной.

Я очень новичок в xsl, пожалуйста, помогите мне, как этого добиться. Это может быть глупо, но я понятия не имею..


person Ironman    schedule 29.10.2012    source источник
comment
включите некоторый код xml, чтобы сообщить нам, что именно вы не можете понять ... что вы пробовали до сих пор?   -  person Memos Electron    schedule 30.10.2012
comment
Расскажите нам, чего вы хотите достичь, и мы расскажем, как этого добиться без перезаписи переменных.   -  person Michael Kay    schedule 30.10.2012


Ответы (3)


<xsl:variable> в xslt на самом деле не является переменной. Это означает, что его нельзя изменить после того, как вы его определили, и вы можете использовать его следующим образом:

скажем, у нас есть этот xml с именем test.xml:

<?xml version="1.0" encoding="UTF-8"?>
<client-list>
    <client>
        <name>person1</name>
    </client>
    <client>
        <name>person2</name>
    </client>
    <client>
        <name>person3</name>
    </client>
</client-list>

и мы хотим преобразовать его в формат csv (значения, разделенные запятыми), но заменив person1 скрытым человеком с именем person4. Допустим, у нас есть этот xml с именем test.xsl, который будет использоваться для преобразования test.xml:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="text"/>

    <xsl:variable name="hiddenname">person4</xsl:variable>
<!-- this template is for the root tag client-list of the test.xml -->
    <xsl:template match="/client-list">
<!-- for each tag with name client you find, ... -->
        <xsl:for-each select="client">
<!-- if the tag with name -name- don't have the value person1 just place its data, ... -->
            <xsl:if test="name != 'person1'">
                <xsl:value-of select="name"/>
            </xsl:if>
<!-- if have the value person1 place the data from the hiddenperson -->
            <xsl:if test="name = 'person1'">
                <xsl:value-of select="$hiddenname"/>
            </xsl:if>
<!-- and place a comma -->
        <xsl:text>,</xsl:text>
        </xsl:for-each>
    </xsl:template>
</xsl:stylesheet>

результаты будут

person4,person2,person3,

Я надеюсь, что это поможет вам.

person Memos Electron    schedule 30.10.2012
comment
Спасибо за вашу помощь .. Теперь я понимаю это ... Спасибо. - person Ironman; 30.10.2012
comment
@SrivatsavaSesham Добро пожаловать! ... Я рад узнать, что я помог вам! - person Memos Electron; 30.10.2012

Мне просто нужно перезаписать переменную в xsl

Пример x=0, если x=0, то x=3

XSLT — это функциональный язык, и среди прочего это означает, что однажды определенная переменная не может быть изменена.

Конечно, этот факт не означает, что данная проблема не может быть решена с помощью XSLT — только то, что решение не содержит никаких модификаций значений переменных, однажды определенных.

Расскажите нам, в чем заключается ваша конкретная проблема, и многие люди смогут предоставить XSLT-решение :)

person Dimitre Novatchev    schedule 29.10.2012

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

<xsl:variable name="initial_condition" select="VALUE"/>

Потом

<xsl:variable name="modified_condition" select="$initial_condition + MODIFIER"/>

Некоторые из наших xsl имеют целые кучи вложенных вычислений, которые действительно должны быть в бизнес-логике, создающей исходный XML. Из-за периода времени, когда не было разработчика/времени для добавления этой бизнес-логики, она была добавлена ​​как часть уровня представления.

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

person Adam    schedule 30.10.2012