我有 2 个节点
<example/>
和<example></example>
。
我怎样才能区分它们?
在我看来,第一个是<xsl:when test="example">
,第二个是
<xsl:when test="example = ''">
。
我不认为这些是正确的,我对此感到困惑。谁能澄清一下?
提前致谢
它们在设计上无法区分。你也可以写
<example />
或者
<example ></example >
而且这些也是无法区分的。
这些变体旨在为创作或生成 XML 的人提供一些灵活性,而不会使使用 XML 的应用程序复杂化。
我怎样才能区分它们?
您无法在 XML 工具中区分它们,因为它们是序列化完全相同的 XML 节点树的两种不同方法。如果您的应用程序需要区分这两种情况1那么您将需要使用某种非 XML 工具,或者专门或作为预处理步骤。
例如,如果您知道/>
原始文件中除了作为空元素标记的一部分之外没有字符串“”的实例,那么您可以对原始文件(视为文本)进行文本替换以更改所有实例的
/>
进入
_wasEmpty="yes"/>
(包括前导空格)在将结果解析为 XML 之前,然后您的 XSLT 可以使用<xsl:when test="example[_wasEmpty = 'yes']">
.
1我(以及 SO 上的许多其他人)会争辩说,声称基于 XML 但需要区分 XML 所说的等效事物的应用程序从根本上被破坏了 - 这里的正确方法是与设计您的格式的人交谈正在消费并要求他们更改它以以 XML 兼容的方式区分情况,例如使用xsi:nil
. 但我很务实,很欣赏有时这是不可能的;-)
<example/>
XML 信息集和 XPath 数据模型表明和之间没有区别<example></example>
:
http://www.w3.org/TR/xml-infoset/#omitted (项目 D.7)
http://www.w3.org/TR/2007/REC-xpath-datamodel-20070123/#ElementNode (您找不到区分空元素的两种不同语法的属性:如果元素没有使用任何一种语法的子元素,元素节点的构造方式相同)
在我看来 - 两种形式的空元素是相等的,无法区分它们。
<xsl:when test="example">
测试是否存在一些名为“example”的元素。
<xsl:when test="example = ''">
测试元素的字符串值是否为空字符串。