#xml #types #marklogic
#xml #типы #marklogic
Вопрос:
Мой вопрос заключается в том, как я могу успешно применить шаблон к данным, которые не соответствуют спецификациям XML. У меня есть входящие данные с именами элементов, такими значениями, как:
Пример документа, извлеченного с помощью fn:doc ($uri):
{
"ID": "208455",
"Type": "Deductions",
"MONTH": "1",
"2015 - Joe's": "14.10%",
}
Часть, которой я хотел бы управлять с помощью моего TDE, это:
«2015 — Joe’s»: «14,10%»
Где само значение является строкой.
Я хотел бы привести значение к десятичной системе счисления, используя шаблон TDE, например, удалив «%». Это работает при выполнении в консоли запросов:
let $s1:= "14.10%"
return fn:number(fn:replace($s1, "[^0-9.]", ""))
###
14.1 (float)
Однако при выполнении одних и тех же связанных функций внутри шаблона:
<column>
<name>value_2015</name>
<scalar-type>string</scalar-type>
<val>fn:number(fn:replace(2015 - Joe's, "[^0-9.], ""))</val>
<nullable>true</nullable>
</column>
Я получаю Compile for Column value_2015='fn:replace(2015 - Joe's, "[^0-9.], "")' returns XDMP-BADCHAR: (err:XPST0003) Unexpected character found ''' (0x0027)
ошибку. Я полагаю, это связано с тем, что имя поля начинается с цифры и содержит символ «‘», что является нарушением приведенной здесь спецификации XML.
Следовательно, я попытался обернуть ссылку на элемент с помощью «»:
<column>
<name>value_2015</name>
<scalar-type>string</scalar-type>
<val>fn:replace("2015 - Joe's", "[^0-9.], "")</val>
<nullable>true</nullable>
но это, конечно, возвращает другую ошибку BADCHAR: XDMP-BADCHAR: (err:XPST0003) Unexpected character found '"' (0x0022)
поскольку теперь у нас есть кавычки в ссылке на элемент.
Как бы я вообще это исправил? Если я не могу ссылаться на элементы, как мне заменить их допустимыми именами элементов XML? Есть ли у меня какие-либо опции, которые мне нравятся, экранируют XML и сообщают шаблону найти буквальное соответствие для заданной последовательности символов в аргументе?
Комментарии:
1. Можете ли вы показать пример исходного XML, к которому вы применяете TDE?
2. Добавлен пример документа, который был извлечен с помощью fn:doc ($ uri)
Ответ №1:
Работает ли использование node («2015 — Joe’s») или text («2015 — Joe’s») в качестве первого аргумента fn:replace()?
Это должно соответствовать текстовому значению с именем свойства «2015 — Joe’s»
Комментарии:
1. Большое вам спасибо. Фрагмент кода fn:заменить(текст(«недопустимое имя xml»), «[^0-9.], «») в качестве аргумента val, похоже, работает точно так, как ожидалось. Приносим извинения за медленное принятие ответа.