Выбор элементов в XSLT на основе атрибутов с использованием .NET - PullRequest
1 голос
/ 06 ноября 2010

Я пишу приложение на C #, используя .NET Framework 3.5 для реализации серии преобразований. Я использую класс XslCompiledTransform для выполнения преобразований. Я хотел бы избежать записи нескольких операторов for-each в моих XSLT-преобразованиях, поэтому я бы хотел выбрать некоторые данные на основе атрибута. Мои исходные данные выглядят следующим образом.

<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 Ответ

5 голосов
/ 06 ноября 2010

Я использую следующее, чтобы попытаться ссылаться на "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 во всем документе . Вы хотите сравнить с string literal 'UHF1', а строковые литералы в XPath должны быть заключены в одинарные или двойные кавычки.

  2. Нет ACIMSCCInstance элемент в документе имеет атрибут name . Вы действительно хотите, чтобы этот тест был выполнен для элемента Radio.

Решение

Исправление двух указанных выше проблем дает нам следующее правильное выражение XPath:

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

Рекомендация : чтение хорошей книги по XPath необходимо для получения базовых знаний, необходимых для работы с XSLT.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...