我正在使用.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']”并且没有骰子。
答案 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
元素的子元素,并且必须是当前节点的子元素。
此表达式中至少有两个严重错误:
整个文档中没有任何名为UHF1
的元素。您想要与字符串文字'UHF1'
进行比较,XPath中的字符串文字必须用单引号或双引号括起来。
文档中没有ACIMSCCInstance
元素具有name
属性。您实际上希望对Radio
元素进行此测试。
<强>解决方案强>:
修复上面的两个问题为我们提供了以下正确的XPath表达式:
Radios/Radio[@name='UHF1']/ACIMSCCInstance
推荐:阅读一本关于XPath的好书对于获取使用XSLT所需的基本知识是必要的。