*从报告中提取特定信息可能具有挑战性。 对于我们很多人来说,我们学会了导航联合管理计划报告使用下标方法来访问我们想要的值。 树结构窗口是我们的朋友(现在仍然是),它向我们展示了构成报告的所有显示框。
您可能已经开始使用显示框名称旁边括号中显示的数字来确保您拥有正确的数字。 然后,您的同事(具有不同的偏好或不同版本的 JMP)运行了您的脚本,但没有得到与您相同的结果。
Report( ow )[Number Col Box( 8 )][1];
这很令人费解,但很快您就学会了一种使用相对引用的更强大的方法。 也就是说,您通过使用包含所需信息的 OutlineBox 标题进行下标来导航报表。
Report( ow )[Outline Box( "Summary of Fit" )][Number Col Box( 1 )][1];
等等,还有另一种浏览 JMP 报告的方法 - 我想您会喜欢它!
以下是摘录自跳转到 JMP 脚本编写,第二版其中讨论了如何将 XPath 查询语言应用于 JMP 报告的 XML 表示形式。
X路径
Wait, there’s another way to traverse JMP reports!Wait, there’s another way to traverse JMP reports!Wait, there’s another way to traverse JMP reports!Wait, there’s another way to traverse JMP reports!Wait, there’s another way to traverse JMP reports!Wait, there’s another way to traverse JMP reports!Wait, there’s another way to traverse JMP reports!Wait, there’s another way to traverse JMP reports!Wait, there’s another way to traverse JMP reports!等等,还有另一种方式来遍历 JMP 报告!我们许多人都熟悉 XML 文档。 对于那些不熟悉的人来说,XML 代表可扩展标记语言。 它是一种标记语言,为机器可读和理解的文档建立了一组规则。 XPath 是一种查询语言,使您能够导航 XML 文档。
尽管 XML 看起来很像 HTML,但它们的用途不同。 HTML 的目的是显示内容,而 XML 的目的更多的是数据存储和传送内容。
让我们讨论一下 XML 文档的一些主要组件:
- 标签– 标签使 XML 看起来有点像 HTML。 标签通常以小于号 (<) 开始,以大于号 (>) 结束。 标记名称在 < 和 > 符号之间指定,并且不是预定义值。 相反,文档的作者必须建立标签名称。 与 HTML 中一样,标签必须以正斜杠结束以表示结束标签(例如, content )。
- 元素– 如果您愿意的话,一个元素由整个标签语句组成。 元素以开始标记的 < 开始,一直到结束标记的 >。 元素也可以包含其他元素。
- 属性– 属性是有关元素的元数据或附加详细信息。 属性在开始标记中指定,并且只能有一个值,用双引号指定。 一个标签可以有多个属性,但每种类型只能有一个。
- 内容– 内容就是数据。 组成元素的是开始标签和结束标签之间的文本、数字和其他字符。
请考虑以下示例 XML 文件。 这开放表element 是所有其他元素出现的根元素。 表元素有一个属性称为当前的,其值为 0 或 1。 每个表元素内都有三个附加元素:姓名,列数, 和行数。 数据出现在标签之间。
Big Class
5
40
Fitness
9
31
现在我们了解了 XML 文档的结构,我们可以将这些知识应用到 XML 文档形式的 JMP 报表的结构中。 要查看 JMP 报告的 XML 表示形式,请发送获取XML消息到报告层。 XML 将出现在日志中 (查看 > 日志)。

让我们看一个例子。 假设您想要以编程方式确定分布报告中出现的大纲框数量。
dt = Open( "$SAMPLE_DATA\Big Class.jmp" );
dist = dt << Distribution(
Stack( 1 ),
Continuous Distribution(
Column( :height ),
Horizontal Layout( 1 ),
Vertical( 0 )
)
);
您可以使用 JSL 单步执行显示框并检查其类型,但这将是一项相当乏味的任务。 相反,让我们看看 XML 表示形式。
Write( Report( dist ) << Get XML );
日志中显示的结果是一个近 180 行长的字符串。 不要不知所措! 滚动到日志顶部并仅查看第一个标签:
该标签被命名为大纲框它有四个属性:宽度,高度,帮助键, 和开了。 接下来的一切都是元素的内容,即大纲框和其他元素的标题。 当您查看其他元素时,请注意元素名称与树结构中的显示框名称相同,但采用 XML 格式。
图 7.5 XML 元素与树结构的比较
<大纲框属性>标题 <列表框属性> <投递箱属性> <间隔盒属性> 投递箱> <大纲框属性>标题 ETC… |
 |
现在我们知道了要搜索的元素的标签名称,让我们探索如何使用 XPath 来找出有多少个大纲框。

在 JMP 中, XPath()消息被发送到平台对象或报告对象。 它的参数是一个 XPath 表达式,用于从报告的 XML 表示形式中检索信息。 你不必使用获取XML在您可以使用之前XPath()信息。 但您可能会发现查看结构和可用属性很有帮助。
下面将在报告中搜索任何大纲框并返回每个大纲框的引用列表。
obList = Report( dist ) << XPath( "//OutlineBox" );
Show( obList );
/*: obList = {DisplayBox[大纲框], DisplayBox[大纲框], DisplayBox[大纲框], 显示框[大纲框]}; |
我们可以简单地使用NItems()功能于对象列表获取列表中存储的大纲框引用的数量。 或者,当您了解有关 XPath 语言的更多信息时,您可以使用XPath 计数()函数返回计数而不是对每个大纲框的引用。
obCount = N Items( Report( dist ) << XPath( "//OutlineBox" ) );
//OR
obCount = Report( dist ) << XPath( "count(//OutlineBox)" );
现在让我们看一个更有趣的例子。 假设我们只想显示单向报告的平均值和标准差表中的平均值和标准差列。
图 7.6 具有均值和标准差的单因素
 |
dt = Open( <BR /> "$SAMPLE_DATA\Big Class.jmp" <BR />);
ow = dt << Oneway(
Y( :height ),
X( :age ),
Means and Std Dev( 1 ),
Mean Error Bars( 1 ),
Std Dev Lines( 1 ),
Mean of Means( 1 )
);
|
我们可以使用以下命令返回“平均值”和“标准偏差”表下仅包含“数字列框”引用的列表
下标和 XPath 的组合:
/* Return a list of NumberColBox references */
ncbList = Report( ow )["Means and Std Deviations"] << XPath( "//NumberColBox" );
使用 JSL为了()循环中,我们可以检查列的标题并将可见性属性更改为
如果标题不是平均值或标准差,则折叠。
/* Loop through each item to show only the Mean, Std Dev columns */
For( i = 1, i <= N Items( ncbList ), i++,
rptColName = ncbList[i] << Get Heading;
If( !Contains( {"Mean", "Std Dev"}, rptColName ),
ncbList[i] << Visibility( "Collapse" )
);
);
但同样,XPath 中有一种方法可以实现相同的结果,而不需要为了()环形。 看
报告中 Number Col Box 的 XML 表示形式摘录:
数字
请注意,其中有一个元素数字列框元素称为数字列框标题。 这
元素包含报告列标题。 XPath 使我们能够捕获该文本并执行
比较。 仅引用标题为 Mean 以外的任何内容的 Number Col Boxes
或标准差以列表形式返回。
colsToHide = Report( ow )["Means and Std Deviations"] << XPath(
"//NumberColBox[NumberColBoxHeader[not(text() = 'Mean')
and not(text() = 'Std Dev')]]"
);
这个 XPath 查询查看数字列框标题出现在 a 中的元素数字列框元素。 Text 函数从文本中提取文本数字列框标题元素。 在此示例中,如果文本满足条件,即文本不平均且不标准差,则引用将在列表中返回。
发送能见度()发送到该列表的消息会将设置应用于列表中的每个项目。
colsToHide << Visibility( "Collapse" );
图 7.7 隐藏列后的单向

Rosemary Lucas 和我希望您发现这些示例有助于浏览您的 JMP 报告。 有关以编程方式浏览报告的更多信息,请查看跳转到 JMP 脚本编写,第二版。

*注:剪贴画来源:空白路标剪贴画
您所说的轮廓框是什么类型?您可以使用OutlineBox()创建轮廓框,例如,您可以使用 << 设置菜单脚本设置红色三角形选项。
Names Default To Here(1);
New Window("Example",
fontobj = ob = Outline Box("Outline Box",
V List Box(
ob2 = Outline Box("Outline Box 2",
H List Box(
Text Edit Box("Top Left"),
Text Edit Box("Top Right")
)
),
ob3 = Outline Box("Outline Box 3",
H List Box(
Text Edit Box("Bottom Left"),
Text Edit Box("Bottom Right")
)
)
)
)
);
ob << Set Menu Script(
{"Beep", Beep(), "Beep Twice", Beep() ; Wait(1.0) ; Beep() ; ,
"", 0, "Get Menu Script", Print(ob << Get Menu Script)}
);
如果您只想复制那个确切的显示框,您可以使用克隆框,然后删除所有子框。这样做可能会导致很多问题
Names Default To Here(1);
dt = open("$SAMPLE_DATA/Big Class.jmp");
dist = dt << Distribution(Nominal Distribution(Column(:sex)), Histograms Only);
obs = dist << XPath("//OutlineBox[@helpKey = 'Distrib']");
ob = obs[1];
obc = ob << Clone Box;
While(!IsEmpty(curchild = obc << child),
curchild << delete box;
);
obc << get xml;