Как получить данные ТДЭ из заголовка в согласованном документе в базе данных FINAL

Я создаю документ 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;
}
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
52
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Элемент 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.

Спасибо, Дэйв, за ваш ответ, теперь я могу получить значение для 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>

Ryan 22.07.2019 16:27

@Ryan попробуйте fwe:UpdatedDate для значения.

Dave Cassel 22.07.2019 16:30

Спасибо за ответ. Я пробовал следующие варианты: 1) <tde:val>fwe:UpdatedDate</tde:val> 2) <tde:val>/fwe:UpdatedDate</tde:val> 3) <tde:val>//fwe:UpdatedDate </tde:val> но ни один не работал. Есть предположения?

Ryan 22.07.2019 16:43

Привет, Дэйв, спасибо за предложение. Похоже, функция, возвращающая значение истории состояний, возвращает строковое значение. Я попытался удалить вызов toString(), но он не работает. Есть мысли по коду? Я попробовал ваше предложение в консоли запросов, но я не могу получить доступ ни к одному элементу в StatusHistory, возможно, потому, что это строка (без зеленых тегов)

Ryan 25.07.2019 11:54

Другие вопросы по теме