对包含资源的传递引用
Transitive reference to contained resources
我们有一个关于引用包含在另一个资源中的资源的查询。假设场景,
ResourceA
|- contains
|- ResourceB
|- ResourceC
并且 ResourceB 引用了 ResourceC。
在上述情况下,ResourceA 是否必须包含对资源 B 和 C 的直接引用?还是 A 引用 B 就足够了,因为已经有对 C 的引用 (A->B->C)?
我们对 FHIR 规范的解释是后者(即传递引用就足够了),阅读以下来自 https://www.hl7.org/fhir/references.html#contained
的声明
A contained resource SHALL only be included in a resource if something
in that resource (potentially another contained resource) has a
reference to it.
然而,在同一文档下还有另一个注释让我们感到困惑,主要是因为该示例仅演示了来自 current() 的引用。
Implementation Note: Contained resources are still a reference rather
than being inlined directly into the element that is the reference
(e.g. "custodian" above) to ensure that a single approach to resolving
resource references can be used. Though direct containment would seem
simpler, it would still be necessary to support internal references
where the same contained resource is referenced more than once. In the
end, all that it would achieve is creating additional options in the
syntax. For users using XPath to process the resource, the following
XPath fragment resolves the internal reference:
ancestor::f:[not(parent::f:)]/f:contained/*[@id=substring-after(current()/f:reference/@value,
'#')]
你能帮忙澄清一下吗?谢谢
你的解释绝对正确。
我相信 xpath 表达式没问题,substring-after(current()/f:reference/@value, '#')
从当前节点中提取 Reference.reference.value 字段并去除前导 #。这是相对于引用字段,而不是包含的资源或容器。路径 ancestor::f:*[not(parent::f:*)]
可以遍历祖先的多个步骤来查找包含的资源,因此它们是在同一资源中还是在容器中无关紧要。它使用包含资源不能包含更多包含资源的约束,否则可能会产生歧义。
目的是让您的行为得到允许。但是,不变量当前定义的方式不起作用 - 在 XPath 或 FHIRPath 中(后者更重要)。老实说,我们还没有想好如何完整地正确表达它,因为我们要寻找的是从包含资源到所有包含资源的引用链或从包含资源到包含资源的引用链.没有允许对此进行递归检查的简单 FHIRPath 或 XPath 表达式。 (XPath 的 'ancestor' 仅适用于实例,不适用于逻辑引用层次结构。)因此 - 您所做的在技术上不符合 R4。它(希望)不会在 R5 中不一致。这当然符合我们 打算 在 R4 中允许的精神...
我们有一个关于引用包含在另一个资源中的资源的查询。假设场景,
ResourceA
|- contains
|- ResourceB
|- ResourceC
并且 ResourceB 引用了 ResourceC。
在上述情况下,ResourceA 是否必须包含对资源 B 和 C 的直接引用?还是 A 引用 B 就足够了,因为已经有对 C 的引用 (A->B->C)?
我们对 FHIR 规范的解释是后者(即传递引用就足够了),阅读以下来自 https://www.hl7.org/fhir/references.html#contained
的声明A contained resource SHALL only be included in a resource if something in that resource (potentially another contained resource) has a reference to it.
然而,在同一文档下还有另一个注释让我们感到困惑,主要是因为该示例仅演示了来自 current() 的引用。
Implementation Note: Contained resources are still a reference rather than being inlined directly into the element that is the reference (e.g. "custodian" above) to ensure that a single approach to resolving resource references can be used. Though direct containment would seem simpler, it would still be necessary to support internal references where the same contained resource is referenced more than once. In the end, all that it would achieve is creating additional options in the syntax. For users using XPath to process the resource, the following XPath fragment resolves the internal reference:
ancestor::f:[not(parent::f:)]/f:contained/*[@id=substring-after(current()/f:reference/@value, '#')]
你能帮忙澄清一下吗?谢谢
你的解释绝对正确。
我相信 xpath 表达式没问题,substring-after(current()/f:reference/@value, '#')
从当前节点中提取 Reference.reference.value 字段并去除前导 #。这是相对于引用字段,而不是包含的资源或容器。路径 ancestor::f:*[not(parent::f:*)]
可以遍历祖先的多个步骤来查找包含的资源,因此它们是在同一资源中还是在容器中无关紧要。它使用包含资源不能包含更多包含资源的约束,否则可能会产生歧义。
目的是让您的行为得到允许。但是,不变量当前定义的方式不起作用 - 在 XPath 或 FHIRPath 中(后者更重要)。老实说,我们还没有想好如何完整地正确表达它,因为我们要寻找的是从包含资源到所有包含资源的引用链或从包含资源到包含资源的引用链.没有允许对此进行递归检查的简单 FHIRPath 或 XPath 表达式。 (XPath 的 'ancestor' 仅适用于实例,不适用于逻辑引用层次结构。)因此 - 您所做的在技术上不符合 R4。它(希望)不会在 R5 中不一致。这当然符合我们 打算 在 R4 中允许的精神...