Re: XSLT : Как переименовать аттрибуты ?
От: Аноним  
Дата: 18.12.03 11:07
Оценка: 31 (2)
PE>есть xml такой примерно

<root>>
PE><row fio="1" id="1"/>
PE><row fio="2" id="2" owner="2"/>
PE><row fio="3" id="3" owner="2"/>
PE></root>

PE>Нужно перегнать в такой вид


<root>>
PE><row caption="1" id="1"/>
PE><row caption="2" id="2" parent="2"/>
PE><row caption="3" id="3" parent="2"/>
PE></root>

PE>Как бы это сделать чз XSLT ?


<xsl:template match="*|text()|@*"><xsl:copy><xsl:apply-templates select="*|text()|@*"/></xsl:copy></xsl:template>

<xsl:template match="@fio"><xsl:attribute name="caption"><xsl:value-of select="."/></xsl:attribute></xsl:template>

<xsl:template match="@owner"><xsl:attribute name="parent"><xsl:value-of select="."/></xsl:attribute></xsl:template>
Re[3]: XSLT : Как переименовать аттрибуты ?
От: Alexey Shirshov Россия http://wise-orm.com
Дата: 18.12.03 13:03
Оценка: 31 (2)
Здравствуйте, Plutonia Experiment, Вы писали:

хъ

PE>Хокей, спасибо. А как селать так, что бы все аттрибуты сохранились ?

PE>Т.е. у элемента могут быть всякие атрибуты, не только эти три.
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
    <xsl:template match="root">
        <xsl:for-each select="row">
            <xsl:element name="row">
            <xsl:for-each select="@*">
                <xsl:variable name="n" select="local-name()"/>
                <xsl:variable name="v" select="string(.)"/>
                <xsl:choose>
                    <xsl:when test="document('map.xml')//attr[@src = $n]">
                        <xsl:attribute name="{document('map.xml')//attr[@src = $n]/@target}">
                            <xsl:value-of select="$v"/>
                        </xsl:attribute>
                    </xsl:when>
                    <xsl:otherwise>
                        <xsl:attribute name="{$n}">
                            <xsl:value-of select="$v"/>
                        </xsl:attribute>
                    </xsl:otherwise>
                </xsl:choose>
            </xsl:for-each>
            </xsl:element>
        </xsl:for-each>
    </xsl:template>
</xsl:stylesheet>


map.xml
<?xml version="1.0" encoding="UTF-8"?>
<mapping>
    <attr src="fio" target="caption"/>
    <attr src="owner" target="parent"/>
</mapping>
... << RSDN@Home 1.1.0 stable >>
XSLT : Как переименовать аттрибуты ?
От: Plutonia Experiment Беларусь http://blogs.rsdn.org/ikemefula
Дата: 18.12.03 10:49
Оценка:
Привет !

есть xml такой примерно

<root>
<row fio="1" id="1"/>
<row fio="2" id="2" owner="2"/>
<row fio="3" id="3" owner="2"/>
</root>

Нужно перегнать в такой вид

<root>
<row caption="1" id="1"/>
<row caption="2" id="2" parent="2"/>
<row caption="3" id="3" parent="2"/>
</root>

Как бы это сделать чз XSLT ?
Re[2]: XSLT : Как переименовать аттрибуты ?
От: Plutonia Experiment Беларусь http://blogs.rsdn.org/ikemefula
Дата: 18.12.03 11:25
Оценка:
Здравствуйте, Аноним, Вы писали:


А>
А><xsl:template match="*|text()|@*"><xsl:copy><xsl:apply-templates select="*|text()|@*"/></xsl:copy></xsl:template>

А><xsl:template match="@fio"><xsl:attribute name="caption"><xsl:value-of select="."/></xsl:attribute></xsl:template>

А><xsl:template match="@owner"><xsl:attribute name="parent"><xsl:value-of select="."/></xsl:attribute></xsl:template>
А>


Хокей, спасибо. А как селать так, что бы все аттрибуты сохранились ?
Т.е. у элемента могут быть всякие атрибуты, не только эти три.
Re[4]: XSLT : Как переименовать аттрибуты ?
От: ibnTeo Россия http://ibnteo.klava.org/
Дата: 18.12.03 15:17
Оценка:
PE>>Хокей, спасибо. А как селать так, что бы все аттрибуты сохранились ?
PE>>Т.е. у элемента могут быть всякие атрибуты, не только эти три.
AS>
AS><?xml version="1.0" encoding="UTF-8"?>
AS><xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
AS>    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
AS>    <xsl:template match="root">
AS>        <xsl:for-each select="row">
AS>            <xsl:element name="row">
AS>            <xsl:for-each select="@*">
AS>                <xsl:variable name="n" select="local-name()"/>
AS>                <xsl:variable name="v" select="string(.)"/>
AS>                <xsl:choose>
AS>                    <xsl:when test="document('map.xml')//attr[@src = $n]">
AS>                        <xsl:attribute name="{document('map.xml')//attr[@src = $n]/@target}">
AS>                            <xsl:value-of select="$v"/>
AS>                        </xsl:attribute>
AS>                    </xsl:when>
AS>                    <xsl:otherwise>
AS>                        <xsl:attribute name="{$n}">
AS>                            <xsl:value-of select="$v"/>
AS>                        </xsl:attribute>
AS>                    </xsl:otherwise>
AS>                </xsl:choose>
AS>            </xsl:for-each>
AS>            </xsl:element>
AS>        </xsl:for-each>
AS>    </xsl:template>
AS></xsl:stylesheet>
AS>


AS>map.xml

AS>
AS><?xml version="1.0" encoding="UTF-8"?>
AS><mapping>
AS>    <attr src="fio" target="caption"/>
AS>    <attr src="owner" target="parent"/>
AS></mapping>
AS>


Зачем же так сложно? Можно чуть подправить предыдущий вариант!
<xsl:template match="@fio">
<xsl:copy-of select="."/>
<xsl:attribute name="caption"><xsl:value-of select="."/></xsl:attribute>
</xsl:template>

<xsl:template match="@owner">
<xsl:copy-of select="."/>
<xsl:attribute name="parent"><xsl:value-of select="."/></xsl:attribute>
</xsl:template>
Re[5]: XSLT : Как переименовать аттрибуты ?
От: Plutonia Experiment Беларусь http://blogs.rsdn.org/ikemefula
Дата: 18.12.03 15:19
Оценка:
Здравствуйте, ibnTeo, Вы писали:

T>Зачем же так сложно? Можно чуть подправить предыдущий вариант!

T>
T><xsl:template match="@fio">
T><xsl:copy-of select="."/>
T><xsl:attribute name="caption"><xsl:value-of select="."/></xsl:attribute>
T></xsl:template>

T><xsl:template match="@owner">
T><xsl:copy-of select="."/>
T><xsl:attribute name="parent"><xsl:value-of select="."/></xsl:attribute>
T></xsl:template>
T>


Чтото у меня не работает. Можно полный пример ?
Re[5]: XSLT : Как переименовать аттрибуты ?
От: Alexey Shirshov Россия http://wise-orm.com
Дата: 18.12.03 15:46
Оценка:
Здравствуйте, ibnTeo, Вы писали:

хъ

T>Зачем же так сложно? Можно чуть подправить предыдущий вариант!

T>
T><xsl:template match="@fio">
T><xsl:copy-of select="."/>
T><xsl:attribute name="caption"><xsl:value-of select="."/></xsl:attribute>
T></xsl:template>

T><xsl:template match="@owner">
T><xsl:copy-of select="."/>
T><xsl:attribute name="parent"><xsl:value-of select="."/></xsl:attribute>
T></xsl:template>
T>


А если таких атрибутов много?
... << RSDN@Home 1.1.0 stable >>
Re[6]: XSLT : Как переименовать аттрибуты ?
От: ibnTeo Россия http://ibnteo.klava.org/
Дата: 19.12.03 07:31
Оценка:
T>>Зачем же так сложно? Можно чуть подправить предыдущий вариант!
T>>
T>><xsl:template match="@fio">
T>><xsl:copy-of select="."/>
T>><xsl:attribute name="caption"><xsl:value-of select="."/></xsl:attribute>
T>></xsl:template>

T>><xsl:template match="@owner">
T>><xsl:copy-of select="."/>
T>><xsl:attribute name="parent"><xsl:value-of select="."/></xsl:attribute>
T>></xsl:template>
T>>


PE>Чтото у меня не работает. Можно полный пример ?


<?xml version="1.0"?>
<xsl:transform version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" encoding="Windows-1251"/>
<xsl:template match="/"><xsl:apply-templates select="*"/></xsl:template>
<xsl:template match="*|text()|@*"><xsl:copy><xsl:apply-templates select="*|text()|@*"/></xsl:copy></xsl:template>
<xsl:template match="@fio">
<xsl:copy-of select="."/>
<xsl:attribute name="caption"><xsl:value-of select="."/></xsl:attribute>
</xsl:template>
<xsl:template match="@owner">
<xsl:copy-of select="."/>
<xsl:attribute name="parent"><xsl:value-of select="."/></xsl:attribute>
</xsl:template>
</xsl:transform>
Re[6]: XSLT : Как переименовать аттрибуты ?
От: ibnTeo Россия http://ibnteo.klava.org/
Дата: 19.12.03 07:33
Оценка:
T>>Зачем же так сложно? Можно чуть подправить предыдущий вариант!
T>>
T>><xsl:template match="@fio">
T>><xsl:copy-of select="."/>
T>><xsl:attribute name="caption"><xsl:value-of select="."/></xsl:attribute>
T>></xsl:template>

T>><xsl:template match="@owner">
T>><xsl:copy-of select="."/>
T>><xsl:attribute name="parent"><xsl:value-of select="."/></xsl:attribute>
T>></xsl:template>
T>>


AS>А если таких атрибутов много?


Задача была переименовать определенные атрибуты (потом оказалось что нужно скопировать определенные), если их будет много, все равно нужно знать какие в какие переименовывать.
Re[7]: XSLT : Как переименовать аттрибуты ?
От: Alexey Shirshov Россия http://wise-orm.com
Дата: 19.12.03 09:51
Оценка:
Здравствуйте, ibnTeo, Вы писали:

хъ

T>Задача была переименовать определенные атрибуты (потом оказалось что нужно скопировать определенные), если их будет много, все равно нужно знать какие в какие переименовывать.


Да, но зачем дублировать код! Это же не эстетично.
... << RSDN@Home 1.1.0 stable >>
Re[8]: ASP.NET и кириллица
От: ibnTeo Россия http://ibnteo.klava.org/
Дата: 19.12.03 10:43
Оценка:
T>>Задача была переименовать определенные атрибуты (потом оказалось что нужно скопировать определенные), если их будет много, все равно нужно знать какие в какие переименовывать.

AS>Да, но зачем дублировать код! Это же не эстетично.


А в чем дублирование?
У нас условие:
— @fio переименовать в @caption
— @owner в @parent
— @* сохраняем как есть

Получаем: 3 условия, 3 <xsl:template/>
Будет больше условий, будет больше шаблонов.
Не вижу здесь никакого дублирования.

Твой представленный код вообще работает с каким-то абстрактным документом, содержащим <root><row>... и использующим функцию document() для загрузки входного документа. Вот усложнять код не эстетично
Re[9]: ASP.NET и кириллица
От: Аноним  
Дата: 19.12.03 10:47
Оценка:
> ASP.NET и кириллица

Как меня эта мозила достала, все время заменяет тему
Re[9]: ASP.NET и кириллица
От: Alexey Shirshov Россия http://wise-orm.com
Дата: 19.12.03 13:23
Оценка:
Здравствуйте, ibnTeo, Вы писали:

хъ

T>Получаем: 3 условия, 3 <xsl:template/>

T>Будет больше условий, будет больше шаблонов.
T>Не вижу здесь никакого дублирования.

Ну как же!
<xsl:template match="@owner">
    <xsl:copy-of select="."/>
    <xsl:attribute name="parent"><xsl:value-of select="."/></xsl:attribute>
</xsl:template>


Будут отличаться только выделенные части. А что, если их много будет? А что, если тебе потом что-нибудь поменять придется?

T>Твой представленный код вообще работает с каким-то абстрактным документом,


Не правда ваша. Он вполне конкретен.

T>содержащим <root><row>... и использующим функцию document() для загрузки входного документа.


Не для входного, а для мапинг-документа.

T>Вот усложнять код не эстетично


А что же вы его тогда усложняете?
... << RSDN@Home 1.1.0 stable >>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.