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

Ult*_*nks 1 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>
Run Code Online (Sandbox Code Playgroud)

我正在使用以下内容来尝试从无线电中引用"ACIMSCCInstance":

<xsl:value-of select="Radios/Radio/ACIMSCCInstance[@name=UHF1]"/>
Run Code Online (Sandbox Code Playgroud)

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

<xsl:value-of select="Radios/Radio/ACIMSCCInstance"/>
Run Code Online (Sandbox Code Playgroud)

这当然给了我列表中第一个无线电的"ACIMSCCInstance"值("1").

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

Dim*_*hev 5

我正在使用以下内容来尝试从无线电中引用"ACIMSCCInstance":

<xsl:value-of select="Radios/Radio/ACIMSCCInstance[@name=UHF1]"/>
Run Code Online (Sandbox Code Playgroud)

但这不起作用

我的问题是,为什么路径末端的"[@ name = UHF1]"不能选择名为"UHF1"的收音机

XPath表达式:

Radios/Radio/ACIMSCCInstance[@name=UHF1]
Run Code Online (Sandbox Code Playgroud)

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

这个表达中至少有两个严重的错误:

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

  2. ACIMSCCInstance文档中没有元素具有name属性.您实际上希望为Radio元素完成此测试.

方案:

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

Radios/Radio[@name='UHF1']/ACIMSCCInstance
Run Code Online (Sandbox Code Playgroud)

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