这个xsl:key有什么问题?

时间:2014-08-13 18:38:51

标签: xml xslt xpath

我正在尝试使用<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"/>

所以,我很高兴听到我的第二把钥匙出了什么问题。

1 个答案:

答案 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子节点。