Я создаю документ TDE, в котором мне нужно получить данные из раздела заголовков согласованного документа, а также получить значения из основного раздела документа (наряд на работу).
Однако кажется, что мое текущее значение контекста tde не отображает ожидаемое значение. Любые мысли о том, почему это происходит в моем текущем коде TDE?
Я пробовал много кодов, таких как приведенный ниже:
//es:headers/ProjectSpecificData/WorkOrderStatusHistory/StatusHistory/StatusHistory
Но он не получает никаких данных из заголовков
Образец согласованного документа в базе данных FINAL
<?xml version = "1.0" encoding = "UTF-8"?>
<envelope xmlns = "http://marklogic.com/entity-services">
<headers>
<sourceURI xmlns = "">/JDEdwards/CMMS/Sample/WorkOrder/DASH_JDEWO/7044389</sourceURI>
<ProjectSpecificData xmlns = "http://testing.com/ads/project">
<CompletedDate xmlns = "http://testing.com/ads/project/fwe">2018-06-29</CompletedDate>
<WorkOrderStatusHistory xmlns = "http://testing.com/ads/project/fwe">
<StatusHistory>
<StatusHistory><UpdatedBy>RFCM</UpdatedBy>
<UpdatedDate>2018/06/24</UpdatedDate>
<StatusCode>55</StatusCode>
<StatusDesc>Scheduled</StatusDesc>
<StatusEffectiveDate>2018-06-24</StatusEffectiveDate>
<StatusEndDate>2018-06-29</StatusEndDate></StatusHistory>
<StatusHistory><UpdatedBy>GPFW</UpdatedBy>
<UpdatedDate>2018/06/23</UpdatedDate>
<StatusCode>10</StatusCode>
<StatusDesc>Job Planning</StatusDesc>
<StatusEffectiveDate>2018-06-23</StatusEffectiveDate>
<StatusEndDate>2018-06-23</StatusEndDate></StatusHistory>
<StatusHistory><UpdatedBy>COLO</UpdatedBy>
<UpdatedDate>2018/07/01</UpdatedDate>
<StatusCode>60</StatusCode>
<StatusDesc>Daily Work in Progress</StatusDesc>
<StatusEffectiveDate>2018-06-29</StatusEffectiveDate>
<StatusEndDate>2018-06-29</StatusEndDate></StatusHistory>
<StatusHistory><UpdatedBy>GPFW</UpdatedBy>
<UpdatedDate>2018/06/22</UpdatedDate>
<StatusCode>05</StatusCode>
<StatusDesc>Ready for Approval</StatusDesc>
<StatusEffectiveDate>2018-06-22</StatusEffectiveDate>
<StatusEndDate>2018-06-23</StatusEndDate></StatusHistory>
<StatusHistory><UpdatedBy>GPFW</UpdatedBy>
<UpdatedDate>2018/06/24</UpdatedDate>
<StatusCode>50</StatusCode>
<StatusDesc>Ready to Schedule</StatusDesc>
<StatusEffectiveDate>2018-06-23</StatusEffectiveDate>
<StatusEndDate>2018-06-24</StatusEndDate></StatusHistory>
<StatusHistory><UpdatedBy>JPGS</UpdatedBy>
<UpdatedDate>2018/06/14</UpdatedDate>
<StatusCode>01</StatusCode>
<StatusDesc>Work Request</StatusDesc>
<StatusEffectiveDate>2018-06-14</StatusEffectiveDate>
<StatusEndDate>2018-06-22</StatusEndDate></StatusHistory>
<StatusHistory><UpdatedBy>COLO</UpdatedBy>
<UpdatedDate>2018/07/01</UpdatedDate>
<StatusCode>65</StatusCode>
<StatusDesc>Completed Ready for Review</StatusDesc>
<StatusEffectiveDate>2018-06-29</StatusEffectiveDate>
<StatusEndDate/></StatusHistory>
</StatusHistory>
</WorkOrderStatusHistory>
</ProjectSpecificData>
</headers>
<triples>
<instance>
<info>
<title>WorkOrder</title>
<version>1.0.1</version>
</info>
<WorkOrder entityExtVersion = "1.0.1" entityVersion = "1.0.1" entity = "WorkOrder" defaultConfidence = "95.00" xmlns = "">
<WorkOrderCode sourcesystem = "Testing" confidence = "95.00">7044389</WorkOrderCode>
</WorkOrder>
</instance>
<attachments>
</attachments>
</envelope>
Текущий код документа TDE:
xquery version "1.0-ml";
import module namespace tde = "http://marklogic.com/xdmp/tde"
at "/MarkLogic/tde.xqy";
let $workordertde:=
<tde:template xmlns:tde = "http://marklogic.com/xdmp/tde">
<tde:context>//es:headers/ProjectSpecificData/WorkOrderStatusHistory/StatusHistory/StatusHistory</tde:context>
<tde:path-namespaces>
<tde:path-namespace>
<tde:prefix>es</tde:prefix>
<tde:namespace-uri>http://marklogic.com/entity-services</tde:namespace-uri>
</tde:path-namespace>
</tde:path-namespaces>
<tde:collections>
<tde:collection>Collection</tde:collection>
</tde:collections>
<tde:enabled>true</tde:enabled>
<tde:rows>
<tde:row>
<tde:schema-name>TestSchema</tde:schema-name>
<tde:view-name>TestView</tde:view-name>
<tde:view-layout>sparse</tde:view-layout>
<tde:columns>
<tde:column>
<tde:name>WorkOrderID</tde:name>
<tde:scalar-type>string</tde:scalar-type>
<tde:val>//es:instance[es:info/es:version = "1.0.1"]/WorkOrder/WorkOrderNo</tde:val>
<tde:invalid-values>ignore</tde:invalid-values>
</tde:column>
<tde:column>
<tde:name>WOStatus</tde:name>
<tde:scalar-type>string</tde:scalar-type>
<tde:val>fn:concat(StatusCode, " - ", StatusDesc)</tde:val>
<tde:nullable>true</tde:nullable>
</tde:column>
<tde:name>BeginDate</tde:name>
<tde:scalar-type>string</tde:scalar-type>
<tde:val>StatusEffectiveDate</tde:val>
<tde:nullable>true</tde:nullable>
</tde:column>
</tde:columns>
</tde:row>
</tde:rows>
</tde:template>
Фактические результаты: Когда я тестирую TDE для одного документа, он не показывает никаких значений:
{
"/WorkOrder/JDEdwards/130008HU52-7044389.xml": [
]
}
Ожидаемые результаты:
Я ожидаю, что TDE будет отображать значения, которые я пытаюсь получить из заголовков (данные StatusHistory), а также в основном разделе (WorkOrdercCode).
Редактировать:
Похоже, функция, возвращающая значение истории состояний, возвращает строковое значение. Я попытался удалить вызов toString(), но он не работает. Есть мысли по коду?
function getStatusHistory(workOrder) {
var status = [];
let statusHistory = cts.search(cts.andQuery([
cts.collectionQuery('Collection1'),
cts.collectionQuery('Collection2'),
//cts.collectionQuery('Collection3'),
cts.elementWordQuery(fn.QName('http://www.testing.com/ads/JDEdwards/wostatushistory', 'F1DOCO'), workOrder)
]));
if (fn.count(statusHistory) <= 0) return "";
let builder;
let doc = new NodeBuilder();
doc.startElement('StatusHistory');
for (const item of statusHistory) {
builder = new NodeBuilder();
builder.startElement('StatusHistory');
//Audit
builder.addElement('UpdatedBy',sfh.ensureStringResult(fn.normalizeSpace(hl.elementText(item, "F1USER", true))));
builder.addElement('UpdatedDate',sfh.ensureStringResult(fn.normalizeSpace(hl.elementText(item, "F1UPMJ", true))));
//Status
let statusCode = fn.normalizeSpace(hl.elementText(item, "F1EWST", true));
builder.addElement('StatusCode',sfh.ensureStringResult(statusCode));
builder.addElement('StatusDesc',sfh.ensureStringResult(getUDCDescription("00", "SS", statusCode)));
builder.addElement('StatusEffectiveDate',sfh.ensureStringResult(fn.replace(fn.normalizeSpace(hl.elementText(item, "F1EFTB", true)),"/","-")));
builder.addElement('StatusEndDate',sfh.ensureStringResult(fn.replace(fn.normalizeSpace(hl.elementText(item, "F1EFTE", true)),"/","-")));
builder.endElement();
doc.addElement('StatusHistory', builder.toNode().xpath('/node()').toString());
}
doc.endElement();
return doc.toNode();
//return status;
}
Элемент ProjectSpecificData
находится в пространстве имен http://testing.com/ads/project
, но вы не указали это пространство имен в своем контекстном пути. Пытаться:
<tde:template xmlns:tde = "http://marklogic.com/xdmp/tde">
<tde:context>//es:headers/ads:ProjectSpecificData/fwe:WorkOrderStatusHistory/fwe:StatusHistory/fwe:StatusHistory</tde:context>
<tde:path-namespaces>
<tde:path-namespace>
<tde:prefix>es</tde:prefix>
<tde:namespace-uri>http://marklogic.com/entity-services</tde:namespace-uri>
</tde:path-namespace>
<tde:path-namespace>
<tde:prefix>ads</tde:prefix>
<tde:namespace-uri>http://testing.com/ads/project</tde:namespace-uri>
</tde:path-namespace>
<tde:path-namespace>
<tde:prefix>fwe</tde:prefix>
<tde:namespace-uri>http://testing.com/ads/project/fwe</tde:namespace-uri>
</tde:path-namespace>
</tde:path-namespaces>
...
</tde:template>
изменить: ответ на комментарий, чтобы я мог использовать форматирование:
Поскольку у вас возникли проблемы с получением значений, возможно, что-то не так с вашим путем. Это будет проще сделать в Query Console, работая с путями напрямую, чем в TDE. В QC настройте следующее:
declare namespace es = "http://marklogic.com/entity-services";
declare namespace ads = "http://testing.com/ads/project";
declare namespace fwe = "http://testing.com/ads/project/fwe";
let $doc := (: your doc :)
let $context := $doc//es:headers/ads:ProjectSpecificData/fwe:WorkOrderStatusHistory/fwe:StatusHistory/fwe:StatusHistory
return $context
Вам что-нибудь вернули? Если это так, отлично, теперь попробуйте вернуть отдельные фрагменты данных, которые вы хотите. Если нет, начните удалять элементы с конца контекстного пути, пока не сделаете этого, а затем выясните, что не так с путем.
Как только вы это сделаете, вы сможете правильно настроить шаблон TDE.
@Ryan попробуйте fwe:UpdatedDate для значения.
Спасибо за ответ. Я пробовал следующие варианты: 1) <tde:val>fwe:UpdatedDate</tde:val> 2) <tde:val>/fwe:UpdatedDate</tde:val> 3) <tde:val>//fwe:UpdatedDate </tde:val> но ни один не работал. Есть предположения?
Привет, Дэйв, спасибо за предложение. Похоже, функция, возвращающая значение истории состояний, возвращает строковое значение. Я попытался удалить вызов toString(), но он не работает. Есть мысли по коду? Я попробовал ваше предложение в консоли запросов, но я не могу получить доступ ни к одному элементу в StatusHistory, возможно, потому, что это строка (без зеленых тегов)
Спасибо, Дэйв, за ваш ответ, теперь я могу получить значение для CompletedDate, но значение для элементов в StatusHistory не отображается, например, UpdatedDate. Это мой код столбца для него: <tde:column> <tde:name>UpdatedDate</tde:name> <tde:scalar-type>string</tde:scalar-type> <tde:val>UpdatedDate</tde :val> <tde:nullable>true</tde:nullable> </tde:column>