XSLT : Как переименовать аттрибуты ?
Привет !
есть 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: 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[2]: 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 : Как переименовать аттрибуты ?
Здравствуйте, 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 >>
Re[4]: XSLT : Как переименовать аттрибуты ?
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 : Как переименовать аттрибуты ?
Здравствуйте, 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 : Как переименовать аттрибуты ?
Здравствуйте, 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 : Как переименовать аттрибуты ?
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 : Как переименовать аттрибуты ?
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 : Как переименовать аттрибуты ?
Здравствуйте, ibnTeo, Вы писали:
хъ
T>Задача была переименовать определенные атрибуты (потом оказалось что нужно скопировать определенные), если их будет много, все равно нужно знать какие в какие переименовывать.
Да, но зачем дублировать код! Это же не эстетично.
... << RSDN@Home 1.1.0 stable >>
Re[8]: ASP.NET и кириллица
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 и кириллица
Здравствуйте, 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 >>
Пока на собственное сообщение не было ответов, его можно удалить.
Удалить