BaseX: Попытка перемещать элементы между пространствами имен в XQuery Update Facility
Я хотел бы нормализовать входной файл XSD, чтобы поставить xs:
перед любыми элементами XSD без xs:
с добавлением XQuery.
copy $c:=doc("test.xsd")
modify
(
if($c/schema)
then
(
for $item in $c//*
where substring($item/text(), 1, 3) != "xs:"
return rename node $item as concat("xs:", $item/text())
)
else ()
)
return $c
Запуск этого xqy на вход XSD без xs:
prepended возвращает входной файл без изменений. Я обновляю $c
и верни это. Так что не так?
входной файл:
<?xml version="1.0"?>
<schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<element name="note" type="xs:string"/>
</schema>
ожидаемый результат:
<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="note" type="xs:string"/>
</xs:schema>
PS: Кажется, мой вопрос вызывает путаницу. я нуждаюсь xs:
представить, потому что у меня есть другая программа обработки текста, которая обрабатывает только элементы с xs:
префикс.
1 ответ
Решение
Это должно работать (это очень похоже на ваш подход):
copy $doc := doc("test.xsd")
modify (
if($doc/*:schema) then (
for $item in $doc//*
let $name := name($item)
where not(starts-with($name, 'xs:'))
let $new-name := xs:QName('xs:' || replace($name, '^.+:', ''))
return rename node $item as $new-name
)
else ()
)
return $doc