使用.NET基于属性在XSLT中选择元素

时间:2010-11-06 00:03:54

标签: c# xml xslt xpath

我正在使用.NET Framework 3.5在C#中编写应用程序来实现一系列转换。我正在使用XslCompiledTransform类来执行转换。我想避免在我的XSLT转换中编写一堆for-each语句,所以我想根据属性选择一些数据。我的源数据如下所示。

<Radios>
      <Radio name="UHF1">
        <GUID protected="true">785A9539-918B-4DCE-A9AA-AC9D6275EA86</GUID>
        <DigitalAudioDeviceInstance protected="true">1</DigitalAudioDeviceInstance>
        <DigitalAudioDevicePort>2</DigitalAudioDevicePort>
        <ACIMLocalInstance protected="true">1</ACIMLocalInstance>
        <ACIMLocalPort>2</ACIMLocalPort>
        <ACIMSCCInstance protected="true">1</ACIMSCCInstance>
      </Radio>
      <Radio name="VHF1">
        <GUID protected="true">C150EA26-E53E-4366-B4A0-84BF619BFD3A</GUID>
        <DigitalAudioDeviceInstance protected="true">2</DigitalAudioDeviceInstance>
        <DigitalAudioDevicePort>2</DigitalAudioDevicePort>
        <ACIMLocalInstance protected="true">2</ACIMLocalInstance>
        <ACIMLocalPort>6</ACIMLocalPort>
        <ACIMSCCInstance protected="true">2</ACIMSCCInstance>
      </Radio>
    </Radios>

我正在使用以下内容尝试从广播中引用“ACIMSCCInstance”:

<xsl:value-of select="Radios/Radio/ACIMSCCInstance[@name=UHF1]"/>

这不起作用但是请记住,“无线电”不是文档的根,我实际上处于相对路径应该工作的适当级别。只是为了确保我试过这个:

<xsl:value-of select="Radios/Radio/ACIMSCCInstance"/>

当然,这给了我列表中第一个收音机的“ACIMSCCInstance”值(“1”)。

我的问题是,为什么路径末端的“[@ name = UHF1]”不能选择名为“UHF1”的收音机。我也试过这个“@ name ='UHF1']”并且没有骰子。

1 个答案:

答案 0 :(得分:5)

  

我正在使用以下内容进行尝试   参考a的“ACIMSCCInstance”   无线电:

<xsl:value-of select="Radios/Radio/ACIMSCCInstance[@name=UHF1]"/>
     

但这不起作用

     

我的问题是,为什么不呢   路径尽头的“[@ name = UHF1]”   选择收音机的工作   名称“UHF1

XPath表达式

Radios/Radio/ACIMSCCInstance[@name=UHF1]

选择ACIMSCCInstance属性等于name的至少一个名为ACIMSCCInstance的子元素的字符串值的所有UHF1元素。此ACIMSCCInstance元素也必须是Radio元素的子元素,并且必须是Radios元素的子元素,并且必须是当前节点的子元素。

此表达式中至少有两个严重错误

  1. 整个文档中没有任何名为UHF1的元素。您想要与字符串文字'UHF1'进行比较,XPath中的字符串文字必须用单引号或双引号括起来。

  2. 文档中没有ACIMSCCInstance元素具有name属性。您实际上希望对Radio元素进行此测试。

  3. <强>解决方案

    修复上面的两个问题为我们提供了以下正确的XPath表达式:

    Radios/Radio[@name='UHF1']/ACIMSCCInstance
    

    推荐:阅读一本关于XPath的好书对于获取使用XSLT所需的基本知识是必要的。