2010-11-06 5 views
1

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

<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

Хороший вопрос, +1. См. Мой ответ для объяснения проблем и полного решения. :) –

ответ

5

Я использую следующее пытается обращения «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.

Решение:

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

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

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

+0

+1 за полезный ответ. 2 вещи: (1) в верхней середине у вас есть опечатка 'UHF' вместо' UHF1'. (2) @Ultratrunks: эта ошибка забывания кавычек и (по сути) случайно использование имени элемента, которого не существует, является коварной проблемой XPath. Большинство языков программирования выдавали ошибку: «Нет такой переменной UHF1». Но XPath не может обнаружить, что ваш входной документ не имеет элемента UHF1, если только он не знает о структуре входного документа. Для этого вам понадобится среда XSLT, поддерживающая схему. – LarsH

+0

@LarsH: Спасибо за это наблюдение - я отредактировал свой ответ. Что касается преимуществ SA XSLT/XPath, да, они действительно приятные. Мои наблюдения показывают, что SA принимается очень медленно - отчасти из-за отсутствия свободных и хороших реализаций, но даже больше из-за отсутствия знаний и опыта среди пользователей. –

+0

Ницца, это сработало. Просто ошибка в голове, которую я не мог видеть своими двумя глазами. – Ultratrunks

Смежные вопросы