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

C# 使用.NET基于属性在XSLT中选择元素,c#,xml,xslt,xpath,C#,Xml,Xslt,Xpath,我正在用C编写一个应用程序,使用.NETFramework 3.5实现一系列转换。我正在使用XslCompiledTransform类来执行转换。我希望避免在XSLT转换中编写一堆for-each语句,因此我希望根据属性选择一些数据。我的源数据如下所示 <Radios> <Radio name="UHF1"> <GUID protected="true">785A9539-918B-4DCE-A9AA-AC9D6275EA86<

我正在用C编写一个应用程序,使用.NETFramework 3.5实现一系列转换。我正在使用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>
我使用以下内容试图从收音机中引用ACIMSCINSTANCE:

<xsl:value-of select="Radios/Radio/ACIMSCCInstance[@name=UHF1]"/>
这不起作用,但是请记住,无线电不是文档的根,事实上,我处于这个相对路径应该起作用的适当级别。为了确保我试过这个:

<xsl:value-of select="Radios/Radio/ACIMSCCInstance"/>
这当然给了我列表中第一个收音机的ACIMSCINSTANCE值1

我的问题是,为什么路径末尾的[@name=UHF1]不能拾取名为UHF1的收音机。我也试过这个@name='UHF1'],没有骰子

我正在使用下面的方法来尝试 从中引用ACIMSCINSTANCE 电台:

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

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

Radios/Radio[@name='UHF1']/ACIMSCCInstance
整个文档中没有任何名为UHF1的元素。要与字符串文字“UHF1”进行比较,XPath中的字符串文字必须用单引号或双引号括起来

文档中没有ACIMSCINSTANCE元素具有名称属性。实际上,您希望对无线电元件进行此测试

解决方案:

解决上述两个问题后,我们可以得到以下正确的XPath表达式:

Radios/Radio[@name='UHF1']/ACIMSCCInstance
建议:阅读一本关于XPath的好书对于获得使用XSLT所需的基本知识是必要的

我正在使用下面的方法来尝试 从中引用ACIMSCINSTANCE 电台:

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

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

Radios/Radio[@name='UHF1']/ACIMSCCInstance
整个文档中没有任何名为UHF1的元素。要与字符串文字“UHF1”进行比较,XPath中的字符串文字必须用单引号或双引号括起来

文档中没有ACIMSCINSTANCE元素具有名称属性。实际上,您希望对无线电元件进行此测试

解决方案:

解决上述两个问题后,我们可以得到以下正确的XPath表达式:

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

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

好问题,+1。有关问题的解释和完整的解决方案,请参见我的答案:好问题,+1。有关问题的解释和完整的解决方案,请参见我的答案:+1.获得有用的答案。2件事:1在中上部你有一个打字错误,UHF而不是UHF1。2@Ultratrunks:忘记引号并实际上意外使用了不存在的元素名的错误是XPath的一个潜在问题。大多数编程语言都会抛出错误,没有这样的变量UHF1。但是XPath无法检测到输入文档没有UHF1元素,除非它知道输入文档的结构。为此,您需要一个支持模式的XSLT开发环境。@LarsH:谢谢您的观察-我编辑了我的答案。至于SA XSLT/XPath的好处,是的,它们非常好。我的观察表明,SA被接受的速度非常缓慢——部分原因是缺乏免费和良好的实现,但更多原因是用户缺乏知识和经验。很好,这很有效。这只是一个我用两只眼睛都看不见的错误。+1表示有用的答案。2件事:1在中上部你有一个打字错误,UHF而不是UHF1。2@Ultratrunks:忘记引号并实际上意外使用了不存在的元素名的错误是XPath的一个潜在问题。大多数编程语言都会抛出错误,没有这样的变量UHF1。但是XPath无法检测到输入文档没有UHF1元素,除非它知道输入文档的结构。为此,您需要一个支持模式的XSLT开发环境。@LarsH:谢谢您的观察-我编辑了我的答案。至于SA XSLT/XPath的好处,是的,它们非常好。我的观察表明,SA被接受的速度非常缓慢——部分原因是缺乏免费和良好的实现,但更多原因是用户缺乏知识和经验。很好,这很有效。只是一个骨头头 我想我用自己的两只眼睛看不见。