powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / [вопрос] преобразование большого количества XML одним XSL
14 сообщений из 14, страница 1 из 1
[вопрос] преобразование большого количества XML одним XSL
    #38514722
sa4iko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В папке (например, C:\Temp) лежит около 1000 XML документов. XSL меняет вид одного XML.
Что написать в командной строке, чтобы XSLT-процессор нашел все XML документы в папке C:\Temp, преобразовал каждый из них с помощью указанной XSL-ки и записал преобразованные документы в отдельную папку (например, C:\Temp\Done)?

Использую Saxon HE, в документации ничего подходящего из ключей не нашел
...
Рейтинг: 0 / 0
[вопрос] преобразование большого количества XML одним XSL
    #38514814
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если дело происходит под виндой, может проще воспользоваться MSXML и vbs/js?
...
Рейтинг: 0 / 0
[вопрос] преобразование большого количества XML одним XSL
    #38515560
sa4iko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Чем угодно воспользуюсь..происходит под виндой.
как создать .bat? (если я правильно понимаю ответ..)
...
Рейтинг: 0 / 0
[вопрос] преобразование большого количества XML одним XSL
    #38520728
sa4ikoкак создать .bat?
Windows PowerShell
...
Рейтинг: 0 / 0
[вопрос] преобразование большого количества XML одним XSL
    #38520760
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не надо bat и тем более ps, надо vbs

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
    Set xslt = CreateObject("MSXML2.XSLTemplate")
    Set xslDoc = CreateObject("MSXML2.FreeThreadedDOMDocument")
    Set xmlDoc = CreateObject("MSXML2.DOMDocument")
    Set stOut = CreateObject("ADODB.Stream")
    stOut.Type = 2
    stOut.Open
    xslDoc.Load "xsl.xsl"
    Set xslt.stylesheet = xslDoc
    xmlDoc.Load "xml.xml"
    Set xslProc = xslt.createProcessor()
    xslProc.input = xmlDoc
    xslProc.output = stOut
    xslProc.Transform
    stOut.Position = 0
    stOut.SaveToFile "result.xml"
...
Рейтинг: 0 / 0
[вопрос] преобразование большого количества XML одним XSL
    #38520826
Итерацию по файлам забыл еще.
...
Рейтинг: 0 / 0
[вопрос] преобразование большого количества XML одним XSL
    #38520849
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не забыл, а забил. Код трансформации у меня под рукой лежал, а писать циклы учат в школе.
...
Рейтинг: 0 / 0
[вопрос] преобразование большого количества XML одним XSL
    #38521196
Да всем залудить с разбегу на то, чему там тебя учили в ПТУ.
Человек аж двух постах внятно дал понять, что больше дружит с командной строкой/батниками, так вот и пускай берет PowerShell, запускает в нем msxsl.exe, и постигает щастье.
А объектами да потоками ты продолжай наслаждаться, разве ж кто тебе мешает.
...
Рейтинг: 0 / 0
[вопрос] преобразование большого количества XML одним XSL
    #38521273
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Конечно, твои пустые высеры его сделают более счастливым. Если ты такое отчаянное гуру PS, напиши ему батник, а не трепись.
...
Рейтинг: 0 / 0
[вопрос] преобразование большого количества XML одним XSL
    #38521371
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AntonariyНе надо bat и тем более ps, надо vbs
И почему же не надо ps?
Код: powershell
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
Function Process-Xsl {
  param (
    [Parameter(ValueFromPipeline=$true)][string] $SourceFilePath
  )
  process {
    $xslt.Transform($SourceFilePath, [io.Path]::ChangeExtension($SourceFilePath, ".htm"));
  }
}
cls;
$xslt = New-Object Xml.Xsl.XslCompiledTransform;
$xslt.Load("D:\Trash\xsl\myxslt.xsl");
ls "D:\Trash\xml" | Select -exp Fullname | Process-Xsl


При желании сюда можно впилить и смену директории для выходных файлов, и использование XmlWriter c XmlWriterSettings, и много еще чего.
...
Рейтинг: 0 / 0
[вопрос] преобразование большого количества XML одним XSL
    #38521410
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно даже еще короче, выше я чуть перемудрил:
Код: powershell
1.
2.
3.
4.
$xslt = New-Object Xml.Xsl.XslCompiledTransform;
$xslt.Load("D:\Trash\xsl\myxslt.xsl");
ls "D:\Trash\xml" | ?{ !$_.PSIsContainer } | Select -exp Fullname |
%{$xslt.Transform($_, [io.Path]::ChangeExtension($_, ".htm"))}
...
Рейтинг: 0 / 0
[вопрос] преобразование большого количества XML одним XSL
    #38521538
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ух, настоящая криптография. )
Зато кратко.
...
Рейтинг: 0 / 0
[вопрос] преобразование большого количества XML одним XSL
    #38521594
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AntonariyУх, настоящая криптография. )
Зато кратко.
Ну, можно развернуть псевдонимы всех командлетов - будет понятнее.
Да, и, наконец, если уж нужен именно Saxon, как было указано выше (мало ли - может у автора XSL 2-й версии), то можно сделать как-то так:
Код: powershell
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
cls;
$srcFolder = "D:\Trash"
$dstFolder = "D:\Trash\1"
# Saxon stuff
Add-Type -Path "D:\Program Files\Saxonica\SaxonHE9.5N\bin\saxon9he-api.dll"
$proc = New-Object Saxon.Api.Processor
$docBuilder = $proc.NewDocumentBuilder()
$xslCompiler = $proc.NewXsltCompiler()
$xslCompiler.BaseUri = New-Object Uri("http://www.w3.org/1999/xhtml")
$xsltExec = $xslCompiler.Compile((New-Object Uri("D:\XSL\myxsl.xsl")))
$xslTrans = $xsltExec.Load()
$serializer = $proc.NewSerializer()
#---------------------
ls $srcFolder | ?{!$_.PSIsContainer} | Select -exp Fullname |
%{
	$xslTrans.InitialContextNode = $docBUilder.Build((New-Object Uri($_)))
	$serializer.SetOutputFile((Join-Path $dstFolder (Split-Path $_ -Leaf)))
	$xslTrans.Run($serializer)
}
Write-Host "done"


Может, действительно было проще сгенерить батник с вызовом консольной утилиты на каждый исходный файл. Только это означает, что утилита каждый раз заново будет парсить шаблон, и если файлов действительно много, то это может сильно сказаться на времени операции - я такое проходил с msxsl: батник работал в разы дольше, чем обработка в цикле внутри простенькой дотнетовской программы.
...
Рейтинг: 0 / 0
[вопрос] преобразование большого количества XML одним XSL
    #38551320
sa4iko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вначале ничего не понял из предложенных вами вариантов и, покопавшись, создал простой .cmd с одной командой for in do.
Сейчас ознакомившись с новым для меня инструментом PS использую последний вариант, трансформация в разы быстрее.

Спасибо большое за развернутые ответы, надеюсь этот топик не канет в архив и будет еще кому-нибудь полезен.
...
Рейтинг: 0 / 0
14 сообщений из 14, страница 1 из 1
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / [вопрос] преобразование большого количества XML одним XSL
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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