2013-10-03 3 views
1

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

Например: Отрывок из XML выглядит следующим образом

<Content version="Title" action="add"> 
    <ProgramContent> 
    <ContentMetaData> 
     <ContentId> 
     <HouseNumber>558960</HouseNumber> 
     <AlternateId idType="SeriesId" authoritativeSource="BCM">19714</AlternateId> 
     <AlternateId idType="EntityId" authoritativeSource="BCM">550133</AlternateId> 
     </ContentId> 
    </ContentMetaData> 
    </ProgramContent> 
</Content> 

и мой код в настоящее время выглядит следующим образом:

<xsl:for-each select="ns0:BxfMessage/ns0:BxfData/ns0:Content"> 
    <xsl:if test="string(@version)= 'Title'"> 
    <xsl:if test="string(//AlternateId[@idType ='SeriesId'])"> 
     <test>hey</test> 
    </xsl:if> 
    </xsl:if> 
</xsl:for-each> 

мне нужно сделать для-каждого цикла на содержание тег, чтобы проверить все из них, но затем внутри этого цикла для каждого цикла я хочу продолжить работу, если атрибут тегов AlternateID не содержит serialId. Поэтому, если любой из них - serialId, я хочу закончить оператор if. Как мне это сделать? Как вы можете видеть, я попробовал оператор if, который должен проверить, равен ли атрибут idType SeriesId, но он терпит неудачу и ничего не возвращает, я что-то делаю неправильно?

Приветствия

ответ

1

Функция string() возвращает строку, но то, что вы хотите булева. Что-то вроде test=//AlternateId[contains(@idType, 'SeriesId')] должно работать лучше.

+2

Да, хотя это должно быть «.//», а не «//», потому что вы хотите, чтобы потомки контекстного узла, а не узлы в любом месте дерева. –

2

Так в основном вы хотите, чтобы петля над всеми <Content> элементов, которые не имеют <AlternateID> элемент с idType="SeriesId".

Вы можете сделать это непосредственно в xsl:for-each, как это:

<xsl:for-each select="ns0:BxfMessage/ns0:BxfData/ns0:Content[descendant::ns0:AlternateID/@idType != 'SeriesId']"> 
+0

элементы контента также должны иметь версию Title также, возможно ли записать два аргумента непосредственно в каждый цикл? – user2835543

+0

Да, просто добавьте еще один предикат. –

+0

Привет, ты был невероятно полезен! – user2835543

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