Гость
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / Как осуществлять преобразование .vdx схем Visio 2003 с помощью XSLT? / 6 сообщений из 6, страница 1 из 1
16.04.2015, 18:10
    #38938578
KA3AKOB
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как осуществлять преобразование .vdx схем Visio 2003 с помощью XSLT?
Возникла необходимость осуществлять массовые преобразования текста в XML представлениях схем от Visio 2003.
Собственно: берём файл со схемами подготовленными с помощью Visio 2003, сохраняем его в виде XML текста (".MyFile.vdx"), а затем осуществляем всякие разные преобразования одних документов XML в другие. Преобразование осуществляется с помощью типового MS процессора XML, например, с помощью такого vbs скрипта:

sub see_tables()
Dim xml, xsl
Dim s 'as String
Dim i 'as Integer
Dim args

set args = WScript.Arguments

set xml = CreateObject("Msxml2.DOMDocument.4.0")
set xsl = CreateObject("Msxml2.DOMDocument.4.0")

s = args(0)
xml.async = false
xml.load s

s = args(1)
xsl.async = false
xsl.load s

s = xml.documentElement.transformNode(XSL.documentElement)
WScript.Echo s
exit sub
end sub

see_tables

Вызов скрипта:
cscript myscript.vbs myFile.vdx myConverter.xsl

Конвертер myConverter.xsl:

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

<xsl:stylesheet version="1.0"
xmlns:xsl=" http://www.w3.org/1999/XSL/Transform"
xmlns:w=" http://schemas.microsoft.com/office/word/2003/wordml"
xmlns:wx=" http://schemas.microsoft.com/office/word/2003/auxHint"
xmlns:vis="urn:schemas-microsoft-com:office:visio"
xmlns:msxsl="urn:schemas-microsoft-com:xslt"
xmlns:user="urn:visio2002-sdk"
>

<xsl:output method="xml" standalone="yes" />

<xsl:template match="/vis:VisioDocument">
<xsl:text disable-output-escaping="yes"><VisioDocument></xsl:text>
<!-- xsl:value-of select="." / -->
<xsl:apply-templates select="child::node()"/>
<xsl:text disable-output-escaping="yes"></VisioDocument></xsl:text>
</xsl:template>


<xsl:template match="vis:DocumentProperties
|vis:DocumentSettings
|vis:Colors
|vis:PrintSetup
|vis:Fonts
|vis:StyleSheets
|vis:DocumentSheet
|vis:Masters
|vis:Pages
|vis:Windows
|vis:EventList
|vis:VBProjectData
"
>

<xsl:text></xsl:text>
<xsl:copy-of select="." />
</xsl:template>

<xsl:template match="text()">
<xsl:text></xsl:text>
</xsl:template>

</xsl:stylesheet>

По идее такое преобразование должно создать почти копию входного vdx файла.
Но возникает вопрос:
Какие теги надо указать в xsl файле, чтобы русские буквы сохранённые в utf-8 в исходном vdx файле, были скопированы в той же кодировке в выходной vdx файл. Вместо этого появляются какие-то однобайтовые символы-кракозябры, которые Visio 2003 на вход вовсе не берёт, ругается, что не та кодировка. Как преодолеть сие?

С уважением,
Казаков С.А.
...
Рейтинг: 0 / 0
16.04.2015, 18:33
    #38938612
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как осуществлять преобразование .vdx схем Visio 2003 с помощью XSLT?
KA3AKOBКак преодолеть сие?Выходная кодировка указывается в <xsl:output>.

Это с одной стороны. А с другой transformNode() кладет на <xsl:output>. Чтобы он учитывался, нужно использовать transformNodeToObject()
...
Рейтинг: 0 / 0
21.04.2015, 17:40
    #38941845
KA3AKOB
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как осуществлять преобразование .vdx схем Visio 2003 с помощью XSLT?
Спасибо за ответ!
Но! Не работает.
Привожу пример на VBScript.
sub see_tables()
Dim xml, xsl 'as DOMDocument
Dim s 'as String
Dim args
Dim fso 'As Scripting.FileSystemObject
Dim txt ' As Scripting.TextStream

set args = WScript.Arguments

set xml = CreateObject("Msxml2.DOMDocument.6.0")
set xsl = CreateObject("Msxml2.DOMDocument.6.0")
set txt = CreateObject("Msxml2.DOMDocument.6.0")

s = args(0)
xml.async = false
xml.load s

s = args(1)
xsl.async = false
xsl.load s

s = args(2)
if (s="") then
s = "bbb.out"
end if
's = xml.documentElement.transformNode (XSL.documentElement)
'WScript.Echo s
'Set fso = CreateObject("Scripting.FileSystemObject")
'Set txt = fso.CreateTextFile(s, -1, -1)
xml.documentElement.transformNodeToObject XSL.documentElement, txt
txt.Save s
exit sub
end sub

see_tables

Как видно из примера, если задавать для процедуры transformNodeToObject вторым параметром txt as DOMDocument, то выходной файл bbb.out пустой.
Если же задавать txt как Stream, то процедура transformNodeToObject такой объект не берёт, даёт ошибку.

Касательно основного вопроса: поскольку скрипт я запускал либо из cmd.exe, либо из Far'a (а как ещё можно скрипт запустить?), то эти досовские программы как-то сами решают о преобразованиях кодовых таблиц (codepage). Попытался переписать на VBA Excel:

Private Sub CommandButton1_Click()
Dim xml As MSXML2.DOMDocument
Dim xsl As MSXML2.DOMDocument
Dim xml_elem As MSXML2.IXMLDOMElement
Dim xsl_elem As MSXML2.IXMLDOMElement
Dim s, pth As String
Dim out As MSXML2.DOMDocument

Set xml = CreateObject("Msxml2.DOMDocument.6.0")
Set xsl = CreateObject("Msxml2.DOMDocument.6.0")

pth = Application.ActiveWorkbook.Path

s = pth & "\" & Me.Cells(1, 1).Value
xml.async = False
xml.Load s
If (Not (xml.parsed)) Then
MsgBox "xml not parsed"
End If
Set xml_elem = xml.documentElement

s = pth & "\" & Me.Cells(1, 2).Value
xsl.async = False
xsl.Load s
If (Not (xsl.parsed)) Then
MsgBox "xsl not parsed"
End If
Set xsl_elem = xml.documentElement

s = pth & "\" & Me.Cells(2, 2).Text
Open s For Output As #6
s = xml_elem.transformNode(xsl_elem)
Write #6, s
out.Save s
Close #6
Exit Sub
end sub



тот требует какого-то непонятного атрибута:
Отсутствует необходимый атрибут
"{ http://www.w3.org/1999/XSL/Transform}version"

Между тем атрибут version="1.0" указан.

С уважением,
Казаков С.А.
...
Рейтинг: 0 / 0
21.04.2015, 18:13
    #38941877
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как осуществлять преобразование .vdx схем Visio 2003 с помощью XSLT?
KA3AKOBвторым параметром txt as DOMDocumentГде код?
KA3AKOBЕсли же задавать txt как Stream, то процедура transformNodeToObject такой объект не берёт, даёт ошибку.Т.е. почитать документацию и узнать какие параметры принимает метод - не судьба?
KA3AKOBэти досовские программыО как!
KA3AKOBкак-то сами решают о преобразованиях кодовых таблиц (codepage).Чушь!
KA3AKOBКасательно основного вопросаКасательно основного вопроса я Вам все детально изложил здесь 17525936
...
Рейтинг: 0 / 0
21.04.2015, 18:14
    #38941879
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как осуществлять преобразование .vdx схем Visio 2003 с помощью XSLT?
Да, и почитайте вот это
...
Рейтинг: 0 / 0
21.04.2015, 18:19
    #38941884
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как осуществлять преобразование .vdx схем Visio 2003 с помощью XSLT?
KA3AKOB
Код: vbnet
1.
xml.documentElement.transformNodeToObject XSL.documentElement, txt

Совет, чтобы не угадывать параметры методов, перед написанием кода читать документацию
xml.documentElement.transformNodeToObject(XSL, txt)[/SRC]
...
Рейтинг: 0 / 0
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / Как осуществлять преобразование .vdx схем Visio 2003 с помощью XSLT? / 6 сообщений из 6, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]