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
Другие вопросы по тегам