如何在jcr中引用属性

时间:2012-10-31 18:04:16

标签: reference nodes jcr

假设我在JCR中有一个节点,用英语提供电影的属性,例如标题,导演和演员。然后我有另一个节点存储相同的属性,但在另一种语言中,比如法语。有没有办法让法语节点引用英语节点,这样只有需要翻译的属性才会实际存储在第二个节点上。例如:

-englishNode 属性 标题:石头之剑 导演:Wolfgang Reitherman 演员:塞巴斯蒂安卡博特

-frenchNode 属性 标题:Merlin L'Enchanteur

但是导演和演员属性将从英语节点中检索,因为它们不需要翻译。但是,调用frenchNode.getProperty(“director”)需要从englishNode中检索属性。

我知道我可以让法语节点成为英语节点的子节点并继承其属性,但我需要一个所有英语电影都在英语节点下生活并且所有法国电影都在法语节点下的结构,所以法国电影不能成为英国电影的兄弟,而是宁可成为“堂兄”。

2 个答案:

答案 0 :(得分:1)

我在JCR中一无所知,直接适应这种情况。但我可以想到几种可能的选择。每种方法都有其自身的优点,一种解决方案在某种情况下可能效果很好,而在另一种情况下却很糟糕。

特定于本地的子节点 将一种语言作为主要语言(例如,无论是后备还是更受欢迎的本地语言),并将特定于本地的属性放在该节点下的特定于本地的子项上。因此,如果英语是主要语言,则电影属性可能存储在电影节点上。法语属性可能存储在“fr”子节点上,德语存储在“de”子节点上等。一个优点是您的应用程序只需加载它使用的语言环境。

后备参考 从一个节点创建一个引用属性到“回退”,并在检索属性时让您的逻辑考虑到这一点。如果该属性不在节点上,请从后备获取该属性,其中可以使用movie.getProperty("fallback").getNode()检索回退节点。 (请注意,使这种递归变得非常容易,后备可能会有后备。)这允许节点存储在不同的位置。但是要警惕循环后备参考(英语的后备是法语,而法语的后备是英语);这是可以处理的,但它需要跟踪一些状态。同样,您的应用程序仅根据需要加载具有特定于语言环境的属性的节点。

特定于本地的属性 在电影节点上存储所有属性,包括英语,法语和任何其他语言的标题。在属性名称上使用后缀或前缀来表示区域设置(例如,en-titlefr-title)。加载单个节点往往会加载所有属性的所有区域设置变体。因此,这适用于较少的语言,较少的本地特定属性和较少的整体属性。

每个“属性”的子节点 将每个“属性”(例如“标题”)放置为子节点,并将每个特定于语言环境的值存储为属性。同样,由于加载节点会加载所有语言环境的值,因此使用较少数量的语言和特定于语言环境的值可以更好地工作。

答案 1 :(得分:0)

我也不认为JCR提供开箱即用的东西。

Apache Sling中,我们使用类似的机制来允许“系统”脚本被“用户”脚本覆盖:处理给定的请求Sling可能会发现/libs/foo/foo.esp上的脚本是一个很好的候选者,但是如果在/apps/foo/foo.esp上有另一个脚本,它将被替代使用。

如果后者存在,你可以用/ content / books / fr / title覆盖/ content / books / en / title属性。您必须在应用程序级别执行此操作,但是这样的“并行路径”结构清晰且易于理解和管理,您只需要定义路径的哪个部分代表内容的区域设置。