0

我正在尝试运行此脚本来解析 XML 文档。当我验证 js 时,我在 for 循环后丢失了 )。我是编程新手,不知道哪里出错了。我已经在最后发布了整个 js 文件。谢谢!

var meds = [];
for (var i = docMedActivities.size(); i--; i >= 0) {
    var activity = docMedActivities.get(i);
    var material = activity.getConsumable().getManufacturedProduct().getManufacturedMaterial();

meds.push({ 
    name: String(material.getName().getText()),
    displayName: String(material.getCode().getDisplayName()),
    ndc: String(material.getCode().getTranslations().get(0).getCode()),
    doseQty: String(activity.getDoseQuantity().getValue()),
    effectiveDateTime: String(activity.getEffectiveTimes().get(0).getLow().getValue()), // 20120502000000+0000
    code: String(material.getCode().getCode())
});
}

整个js文件如下:

// Load the CCD Document
var doc = org.openhealthtools.mdht.uml.cda.util.CDAUtil.load(new java.io.ByteArrayInputStream(messageObject.getRawData().getBytes("UTF-8")));

// Get CCD Document Sections to be parsed
var docPatientRole = doc.getRecordTargets().get(0).getPatientRole();
var docPatient = docPatientRole.getPatient();
var docPatientName = docPatient.getNames().get(0);
var docPatientAddress = docPatientRole.getAddrs().get(0);
var docMedSection = doc.getMedicationsSection();
var docMedActivities = docMedSection.getMedicationActivities();

// Patient Identity
var patient = {
firstName:  String(docPatientName.getGivens().get(0).getText()),
lastName: String(docPatientName.getFamilies().get(0).getText()),
genderCode: String(docPatient.getAdministrativeGenderCode().getCode()),
dateOfBirth: String(docPatient.getBirthTime().getValue()) // YYYYMMDD
};

// Patient Address
var address = {
addressCity: String(docPatientAddress.getCities().get(0).getText()),
addressState: String(docPatientAddress.getStates().get(0).getText()),
addressPostalCode: String(docPatientAddress.getPostalCodes().get(0).getText())
};

// Patient Medication Activities
var meds = [];
for (var i = docMedActivities.size(); i--; i >= 0) {
var activity = docMedActivities.get(i);
var material =   activity.getConsumable().getManufacturedProduct().getManufacturedMaterial();

meds.push({
    name: String(material.getName().getText()),
    displayName: String(material.getCode().getDisplayName()),
    ndc: String(material.getCode().getTranslations().get(0).getCode()),
    doseQty: String(activity.getDoseQuantity().getValue()),
    effectiveDateTime: String(activity.getEffectiveTimes().get(0).getLow().getValue()), // 20120502000000+0000
    code: String(material.getCode().getCode())
});
}

// Populate Channel Map, use JSON so logs are readable
channelMap.put('patient', JSON.stringify(patient, null, 2));
channelMap.put('address', JSON.stringify(address, null, 2));
channelMap.put(&apos;meds&apos;, JSON.stringify(meds, null, 2));</script>
      <type>JavaScript</type>
      <data class="map">
        <entry>
          <string>Script</string>
          <string>// Load the CCD Document
var doc = org.openhealthtools.mdht.uml.cda.util.CDAUtil.load(new    java.io.ByteArrayInputStream(messageObject.getRawData().getBytes(&quot;UTF-8&quot;)));

// Get CCD Document Sections to be parsed
var docPatientRole = doc.getRecordTargets().get(0).getPatientRole();
var docPatient = docPatientRole.getPatient();
var docPatientName = docPatient.getNames().get(0);
var docPatientAddress = docPatientRole.getAddrs().get(0);
var docMedSection = doc.getMedicationsSection();
var docMedActivities = docMedSection.getMedicationActivities();

// Patient Identity
var patient = {
firstName:  String(docPatientName.getGivens().get(0).getText()),
lastName: String(docPatientName.getFamilies().get(0).getText()),
genderCode: String(docPatient.getAdministrativeGenderCode().getCode()),
dateOfBirth: String(docPatient.getBirthTime().getValue()) // YYYYMMDD
};

// Patient Address
var address = {
addressCity: String(docPatientAddress.getCities().get(0).getText()),
addressState: String(docPatientAddress.getStates().get(0).getText()),
addressPostalCode: String(docPatientAddress.getPostalCodes().get(0).getText())
};

// Patient Medication Activities
var meds = [];
for (var i = docMedActivities.size(); i--; i &gt;= 0) {
var activity = docMedActivities.get(i);
var material =   activity.getConsumable().getManufacturedProduct().getManufacturedMaterial();

meds.push({
    name: String(material.getName().getText()),
    displayName: String(material.getCode().getDisplayName()),
    ndc: String(material.getCode().getTranslations().get(0).getCode()),
    doseQty: String(activity.getDoseQuantity().getValue()),
    effectiveDateTime: String(activity.getEffectiveTimes().get(0).getLow().getValue()), // 20120502000000+0000
    code: String(material.getCode().getCode())
});
}

// Populate Channel Map, use JSON so logs are readable
channelMap.put(&apos;patient&apos;, JSON.stringify(patient, null, 2));
channelMap.put(&apos;address&apos;, JSON.stringify(address, null, 2));
channelMap.put(&apos;meds&apos;, JSON.stringify(meds, null, 2));
4

3 回答 3

3

在 JS 文件中,您需要编写>=而不是&gt;=; 后者仅在 JS 嵌入 (X)HTML PCDATA 时才有意义。

(错误消息的奇怪措辞的原因是验证器将其解释gt为标识符,并使用按位与运算符i & gt解释为表达式。因此,当它看到分号时,它认为-loop 标头应该结束。)for


编辑添加:此外,虽然您的for-loop 在您进行此更改后将起作用,但这只是由于一系列奇怪的怪癖和巧合。这个:

for (var i = docMedActivities.size(); i--; i >= 0) {
    ...
}

这意味着:

var i = docMedActivities.size();
while (i--) {      // note the post-increment: i-- evaluates to i's old value
    ...
    i >= 0;        // note that this expression has no side-effects
}

这相当于:

var i = docMedActivities.size();
while (i != 0) {
    i--;
    ...
}
i--;

碰巧做你想做的事。因此,您的代码恰好可以正常工作,但这并不是因为它看起来确实如此,并且将来任何微小的更改都会以令人困惑的方式破坏它。

你真正想写的是:

for (var i = docMedActivities.size() - 1; i >= 0; i--) {
    ...
}

(在初始化表达式中i >= 0出现 i--并且- 1在初始化表达式中出现)。

于 2013-03-25T18:32:31.913 回答
1

在脚本中,您不需要转义 HTML 实体。JS 解析器在您的 for 语句中检测到 3 个分号,这是一个过多而无效的分号 - 需要一个右括号。

此外,您已经用更新代码交换了条件。将其更改为

for (var i = docMedActivities.size(); i>=0; i--)
于 2013-03-25T18:37:20.943 回答
0

问题在于循环的这一部分:i &gt;= 0

在第三个逗号之后,for 语句通常结束,这就是为什么需要/需要右括号的原因。将 更改&gt;>。意思是“&gt;大于”,建议您从某处复制此代码,但可能需要在其他地方更改。

另外,我很确定您的 for 语句的顺序应该是:

for (var i = docMedActivities.size(); i >= 0; i--) {

请注意,i--应该是语句的第三部分,而“大于”部分应该是第二部分。最后一部分后面的逗号也不是必需的。

由于您是编码新手,我建议您至少查看一下这个关于 for-loops 的页面。但是总体上看一下 JavaScript 的一些介绍会是一个好主意。

希望这可以帮助。

于 2013-03-25T18:35:59.443 回答