我正在尝试使用<xsl:key>
来匹配来自几个不同xml标记的“数据”,但它似乎不像我理解的那样工作..
以下是xml示例:
<root>
<parts>
<part class="Button" id="b1"/>
<part class="Button" id="b2"/>
<part class="Label" id="text"/>
<part class="div" id="div1">
<part class="Checkbox" id="cb1">
<part class="CheckboxItem" id="item1"/>
<part class="CheckboxItem" id="item2"/>
</part>
</part>
</parts>
<properties>
<property part-name="b1" name="label">button 1</property>
<property part-name="b2" name="label">button 2</property>
<property part-name="text" name="label">
<reference const="text"/>
</property>
<property part-name="cb1" name="label">
<reference const="cb1"/>
</property>
<property part-name="item1" name="label">
<reference const="item1"/>
</property>
<property part-name="item2" name="label">
<reference const="item2"/>
</property>
</properties>
<content>
<constant id="cb1" value="Favourite Ice Cream?"/>
<constant id="item1" value="Vanilla"/>
<constant id="item2" value="wChocholate"/>
</content>
</root>
一些简短的解释 - <part>
具有唯一的id
。这个id
在<property>
标记中与part-name
属性匹配。
我对两个'按钮'部件和它们的属性没有问题,a.k.a。 - 在这种特殊情况下的标签。这是我用于此场景的密钥类型:
<xsl:key name="Labels" match="property[@name='label']" use="@part-name"/>
然后在我的XSLT中我得到了值:
<xsl:value-of select="key('Labels', @id)"/>
然后我尝试了不同的方法,我想从value
代码中提取<content>
,并根据唯一的part
将其与每个id
匹配。
到目前为止我所拥有的是:
<xsl:key name="Contents" match="property[@part-name]" use="content/constant[@id]" />
稍后用以下方式调用:
<xsl:value-of select="key('Contents', @part-name)/@value"/>
所以,我很高兴听到我的第二把钥匙出了什么问题。
答案 0 :(得分:3)
我想从
中提取value
代码<content>
我认为您要从value
内的<constant>
元素中提取<content>
。如果是这样,您的密钥需要如下所示:
<xsl:key name="Contents" match="constant" use="@id"/>
有了这个,以下内容:
<xsl:value-of select="key('Contents', 'cb1')/@value" />
将返回:
Favourite Ice Cream?
-
你拥有它的方式:
<xsl:key name="Contents" match="property[@part-name]" use="content/constant[@id]" />
无法工作,因为(a)您匹配错误的元素(您不想从property
查找数据); (b) 匹配的元素没有指定的use
节点:property
元素没有content
子节点。