Модераторы: diadiavova
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Изменение атрибута в XML c помощью XSL 
:(
    Опции темы
alex48
Дата 18.4.2011, 17:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 18.4.2011

Репутация: нет
Всего: нет



Имеется такой XML:
Код

<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE view SYSTEM 'C:\Alex\lotus\notes\xmlschemas/domino_7_0_2.dtd'>
<view name='view1' xmlns='http://www.lotus.com/dxl' version='7.0' maintenanceversion='2.0'
 replicaid='C32578760040C374' showinmenu='false' noreplace='true' publicaccess='false'
 designerversion='7' unreadmarks='none' onopengoto='lastopened' onrefresh='displayindicator'
 headers='beveled' opencollapsed='false' showresponsehierarchy='true' showmargin='true'
 shrinkrows='false' extendlastcolumn='false' unreadcolor='black' rowlinecount='1'
 headerlinecount='1' rowspacing='1' bgcolor='white' totalscolor='black' headerbgcolor='white'
 boldunreadrows='false' evaluateactions='false' allownewdocuments='false'
 allowcustomizations='true' hidemarginborder='false' marginwidth='0px' marginbgcolor='white'
 uniquekeys='false'>
<noteinfo noteid='13a' unid='78635C57CE4F809CC32578760040CEF3' sequence='4'>
<created><datetime dst='true'>20110418T154752,83+04</datetime></created>
<modified><datetime dst='true'>20110418T155118,11+04</datetime></modified>
<revised><datetime dst='true'>20110418T155118,10+04</datetime></revised>
<lastaccessed><datetime dst='true'>20110418T155118,10+04</datetime></lastaccessed>
<addedtofile><datetime dst='true'>20110418T154752,83+04</datetime></addedtofile></noteinfo>
<updatedby><name>CN=Aleksey</name></updatedby>
<wassignedby><name>CN=Aleksey</name></wassignedby><code
 event='selection'><formula>@All</formula></code>
<actionbar bgcolor='maroon' bordercolor='black'>
<actionbuttonstyle bgcolor='#f0f0f0'/><font size='9pt' color='system'/><border
 style='solid' width='0px 0px 1px'/>
<action title='"dddd"'/></actionbar>
<column itemname='$0' width='10' resizable='true' separatemultiplevalues='false'
 sortnoaccent='true' sortnocase='true' showaslinks='false'><columnheader title='#'><font
 size='9pt' style='bold'/></columnheader><code event='value'><formula>@DocNumber</formula></code></column></view>


Необходимо изменить с помощью XSL необходимо изменить заданный атрибут заданного элемента на какое либо строковое значение. 
Например: 
Код

<actionbar bgcolor='maroon' bordercolor='black'>

Атрибут bgcolor на значение red

Использую Lotus, а он как то странно всё преобразет. Делал так:
Код

<?xml version="1.0" encoding="UTF-8" ?> 
<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:fo="http://www.w3.org/1999/XSL/Format" 
xmlns:xs="http://www.w3.org/2001/XMLSchema" 
xmlns:fn="http://www.w3.org/2005/xpath-functions" 
xmlns:dxl='http://www.lotus.com/dxl'> 
<xsl:template match="actionbar">
<xsl:copy-of select="*"/> 
</xsl:template>
</xsl:stylesheet> 

Получал это:
Код

<?xml version="1.0" encoding="UTF-8"?>


20110418T154752,83+04
20110418T160929,42+04
20110418T160929,41+04
20110418T160929,41+04
20110418T154752,83+04
CN=Aleksey
CN=Aleksey@All



@DocNumber


А мне нужен исходный XML но с другим цветом.

Помогите составить XSL преобразование, пробовал копировать элемент aсtionbar, но а как же другие элементы да и как потом что-то поменять.



Это сообщение отредактировал(а) alex48 - 19.4.2011, 13:32
PM MAIL   Вверх
diadiavova
Дата 19.4.2011, 01:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 22
Всего: 142



Код

<?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" indent="yes"/>

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

    <xsl:template match="actionbar/@bgcolor">
        <xsl:attribute name="bgcolor">red</xsl:attribute>
    </xsl:template>
</xsl:stylesheet>




--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
alex48
  Дата 19.4.2011, 10:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 18.4.2011

Репутация: нет
Всего: нет



Выводит только не измененный ХМЛ
Пробовал так:
Код

<?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" indent="yes"/>
    <xsl:template match="@* | node()">
        <xsl:copy>
            <xsl:apply-templates select="@* | node()"/>
        </xsl:copy>
    </xsl:template>
        <xsl:attribute-set name="actionbar">
             <xsl:attribute name="bgcolor">red</xsl:attribute>
        </xsl:attribute-set> 
</xsl:stylesheet>

но тоже увы, может надо перебирать все атрибуты и все елементы кроме node()='atctionbar', вот только не равно не знаю как поставить....
Кстати конструкция:
Код

<?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" indent="yes"/>
    <xsl:attribute-set name="actionbar">
         <xsl:attribute name="bgcolor">red</xsl:attribute>
    </xsl:attribute-set> 
</xsl:stylesheet>

Тоже почему то не работает

ыл бы признателен за помощ....
Хотя есть ещё вариант - работа со строками: искать строку "<actionbar" , потом до строки ">", а затем искать в этой бод строке другое вхождение, но этот способ какой то не красивый....

PM MAIL   Вверх
diadiavova
Дата 19.4.2011, 10:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 22
Всего: 142



Цитата(alex48 @  19.4.2011,  11:42 Найти цитируемый пост)
Выводит только не измененный ХМЛ

Да ладно smile Вот для такого документа
Код

<?xml version="1.0" encoding="utf-8" ?>
<root>
    <actionbar bgcolor="maroon" bordercolor="black"/>
</root>

Получается такой вывод
Код

<?xml version="1.0" encoding="utf-8"?>
<root>
    <actionbar bgcolor="red" bordercolor="black" />
</root>
Разве это не то, что нужно? smile 
Если в твоем документе не работает(а я его подробно не изучал) то можно изменить выражение для шаблона, меняющего атрибут таким образом
Код

<?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" indent="yes"/>

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

    <xsl:template match="//actionbar/@bgcolor">
        <xsl:attribute name="bgcolor">red</xsl:attribute>
    </xsl:template>
</xsl:stylesheet>

По идее должно сработать.
Цитата(alex48 @  19.4.2011,  11:42 Найти цитируемый пост)
Кстати конструкция:


Цитата(alex48 @  19.4.2011,  11:42 Найти цитируемый пост)
Тоже почему то не работает

А почему она должна работать? smile

Добавлено через 9 минут
Таки посмотрел я документ, в таком виде действительно не работает, но проблема тут в пространстве имен(в твоем примере для того, чтобы увидеть надо дергать горизонтальную прокрутку, просто переносить надо, чтобы пример читабельным был). Это пространство имен надо в преобразовании объявить и выражения составлять именно для него.
Код

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                                xmlns:q="http://www.lotus.com/dxl" >
    <xsl:output method="xml" indent="yes"/>

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

    <xsl:template match="//q:actionbar/@bgcolor">
        <xsl:attribute name="bgcolor">red</xsl:attribute>
    </xsl:template>
</xsl:stylesheet>




--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
alex48
Дата 19.4.2011, 12:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 18.4.2011

Репутация: нет
Всего: нет



ух ты класс, работает как надо. спасибо.

а я кстати бился бился и сделал вторым способом через строки на VB:
Код

Function getReplaceAttribute(xml As String,element As String, attribute As String, value As String) As String
    Dim index1 As Integer
    Dim index2 As Integer
    If getSubStringIndex(xml,|<|+element+| |,|>|,index1,index2)<>"" Then
        If getSubStringIndex(xml,attribute+|='|,|'|,index1,index2)<>"" Then
            getReplaceAttribute=Left(xml,index1-1)+value+Right(xml,Len(xml)-index2+1)
        End If        
    End If
End Function

Function getSubStringIndex(source As String,b0 As String,e0 As String,index0 As Integer,index1 As Integer) As String
    Dim i0 As Integer
    Dim source0 As String
    source0=source
    i0=1
    If index0>0 Then  i0=index0
    If index1>0 Then  source0=Left(source0,index1-1)
    i0=Instr(i0,source0,b0,5)
    If i0=0 Then Exit Function
    i0=i0+Len(b0)
    Dim i1 As Integer
    i1=Instr(i0,source0,e0,5)
    If i1=0 Then Exit Function
    getSubStringIndex=Mid(source0,i0,i1-i0)    
    index0=i0
    index1=i1
End Function


а вызывать так:
Код

Messagebox getReplaceAttribute(XML.ReadText,"actionbar","bgcolor","blue")

где XML потоковый объект, считывающий XML из файла.
Может кому пригодится smile

Воспользуюсь вашим способом smile
PM MAIL   Вверх
alex48
Дата 19.4.2011, 14:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 18.4.2011

Репутация: нет
Всего: нет



всё здорово, но никак ни могу добавить атрибут style="bold" элемента font вложенного в actionbar.
Код

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                                xmlns:dxl="http://www.lotus.com/dxl" >
    <xsl:output method="xml" indent="yes"/>
    <xsl:template match="@* | node()">
        <xsl:copy>
            <xsl:apply-templates select="@* | node()"/>
        </xsl:copy>
    </xsl:template>
    <xsl:template match="//dxl:actionbar/@bgcolor">
        <xsl:attribute name="bgcolor">color0</xsl:attribute>
    </xsl:template>
    <xsl:template match="//dxl:actionbuttonstyle/@bgcolor">
        <xsl:attribute name="bgcolor">color0</xsl:attribute>
    </xsl:template>
    <xsl:template match="//dxl:font/@style">
        <xsl:attribute name="style">bold</xsl:attribute>
    </xsl:template>
</xsl:stylesheet>

я так понимаю, это не работает потому что нет атрибута style (его нужно создать както), но если сделать так:
Код

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                                xmlns:dxl="http://www.lotus.com/dxl" >
    <xsl:output method="xml" indent="yes"/>
    <xsl:template match="@* | node()">
        <xsl:copy>
            <xsl:apply-templates select="@* | node()"/>
        </xsl:copy>
    </xsl:template>
    <xsl:template match="//dxl:actionbar/@bgcolor">
        <xsl:attribute name="bgcolor">color0</xsl:attribute>
    </xsl:template>
    <xsl:template match="//dxl:actionbuttonstyle/@bgcolor">
        <xsl:attribute name="bgcolor">color0</xsl:attribute>
    </xsl:template>
    <xsl:template match="//dxl:font/@*">
        <xsl:attribute name="style">bold</xsl:attribute>
    </xsl:template>
</xsl:stylesheet>

НО тогда он затирает все другие атрибуты :(
Может быть надо сохранить их вначале в переменные (вот только атрибутов может быть много) а затем их потом создать вместе с новым?

Имеется вопросик:
Код

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                                xmlns:dxl="http://www.lotus.com/dxl" >
    <xsl:output method="xml" indent="yes"/>
    <xsl:template match="@* | node()">
        <xsl:copy>
            <xsl:apply-templates select="@* | node()"/>
        </xsl:copy>
    </xsl:template>
    <xsl:template match="//dxl:actionbar/font/@*">
        <xsl:attribute name="style">bold</xsl:attribute>
    </xsl:template>
</xsl:stylesheet>
ТАкая вложенность не работает, потому как мне нужно изменить атрибут только в font actionbar. Был бы признателен за подсказку 
PM MAIL   Вверх
diadiavova
Дата 19.4.2011, 22:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 22
Всего: 142



Такая конструкция и не может работать правильно, в силу того, что атрибуты можно добавлять к элементам, а ты пытаешься заменить все атрибуты своим.
Думаю надо сделать как-то так.
Код

    <xsl:template match="//dxl:actionbar/font">
        <xsl:copy>
            <xsl:attribute name="style">bold</xsl:attribute>
        </xsl:copy>
    </xsl:template>



--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
alex48
Дата 20.4.2011, 11:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 18.4.2011

Репутация: нет
Всего: нет



Попробовал, но реботает.

По-моему просто не работает 
Код

<xsl:template match="//dxl:actionbar/font">


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

Убрал вложенность с методом КОПИ, но всё также все атрибуты затираются и ставится один style="bold", может как то подругому вложенностьь эту надо указывать с этим пространством имен?
PM MAIL   Вверх
diadiavova
Дата 20.4.2011, 12:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 22
Всего: 142



Код

    <xsl:template match="//dxl:actionbar/dxl:font">
        <xsl:copy>
            <xsl:attribute name="style">bold</xsl:attribute>
            <xsl:apply-templates select="@* | node()"/>
        </xsl:copy>
    </xsl:template>


Это сообщение отредактировал(а) diadiavova - 20.4.2011, 12:07


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "XML/XSLT"
diadiavova

Прежде чем опубликовать вопрос, попробуйте воспользоваться поиском - возможно тема уже поднималась.

Также рекомендуем Вам зайти в раздел FAQ ,раздел дополняется и, возможно, там вы увидите готовое решение.

Для ответов на часто задаваемые вопросы существует FAQ раздела. Новости можно публиковать в разделе новостей. Для статей так же есть специальный раздел

Желаем удачи в Вашем деле!


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, diadiavova.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | XML, XSL | Следующая тема »


 




[ Время генерации скрипта: 0.0738 ]   [ Использовано запросов: 20 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.