Я хотел бы нормализовать входной файл XSD, чтобы поставить xs:
перед любыми элементами XSD без xs:
, добавленных с помощью XQuery.BaseX: Попытка перемещения элементов между пространствами имен в XQuery Update Facility
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:
возвращает входной указывая префикс файла без изменений. Я обновляю $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:
.
Вещи, которые вы пытаетесь обновить не текстовые узлы на всех, и хз: не текстуальное префикс, это псевдоним пространства имен. Поэтому попытка совместить подстроки узлов 'text()' не имеет никакого смысла. –
, т. Е. То, что вы * на самом деле * пытаетесь сделать, с точки зрения XML-документа-семантики (это уровень, на котором работает любой запрос BaseX), заменяет элементы в пространстве имен по умолчанию с помощью одинаковых элементов в пространстве имен 'http: // www.w3.org/2001/XMLSchema'. –
... на самом деле есть ответы на вопросы о том, как это сделать в XSLT - см. Т.е. http://stackoverflow.com/questions/9026224/how-to-mimic-copy-namespaces-no-in-xslt-1-0/9030832#9030832 - но я не могу помочь вам в XQUF. –