2017-01-15 4 views
0

Я хотел бы нормализовать входной файл 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:.

+0

Вещи, которые вы пытаетесь обновить не текстовые узлы на всех, и хз: не текстуальное префикс, это псевдоним пространства имен. Поэтому попытка совместить подстроки узлов 'text()' не имеет никакого смысла. –

+0

, т. Е. То, что вы * на самом деле * пытаетесь сделать, с точки зрения XML-документа-семантики (это уровень, на котором работает любой запрос BaseX), заменяет элементы в пространстве имен по умолчанию с помощью одинаковых элементов в пространстве имен 'http: // www.w3.org/2001/XMLSchema'. –

+0

... на самом деле есть ответы на вопросы о том, как это сделать в XSLT - см. Т.е. http://stackoverflow.com/questions/9026224/how-to-mimic-copy-namespaces-no-in-xslt-1-0/9030832#9030832 - но я не могу помочь вам в XQUF. –

ответ

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 
Смежные вопросы